在使用selenium进行操作时,有时候在定位元素时会报错。这可能是因为元素还没有来得及加载导致的。可以等过元素等待,等待元素出现。有强制等待,显式等待,隐式等待。

强制等待

就是之前文章中的time.sleep(),只是为了看到界面操作效果才那样设置的。这个是不管找没找到都会等待的。基本代码中不会用这个。

显式等待

WebDriverWait类是WebDriver提供的等待方法。在设置的时间内,会每隔一段时间去检查一次当前页面元素是否存在,如果超过设置时间还没有见到到就抛出异常。具体格式如下:

需要先导入from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver:浏览器实例

timeout:超时时间,默认已秒为单位

poll_frequency:检测时间间隔,默认0.5秒

ignored_exceptions:报错信息,默认抛出NoSuchElementException

一般是配合until()和until_not()方法使用

until():可以传两个参数,第一个参数是判断条件,直到第一个参数返回True。第二个参数可以写文字说明。

until_not():可以传两个参数,第一个参数是判断条件,直到第二个参数返回False。第二个参数可以写文字说明

expected_conditions类下提供预期条件判断方法,具体有哪些方法可以自己查下,以title_is()方法举例,对比title是否正确的。

需要先导入from selenium.webdriver.support import expected_conditions

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions
dr = webdriver.Chrome()
dr.maximize_window()
dr.get("https://www.baidu.com")#打开百度
tr = dr.title#获取title
wait = WebDriverWait(dr,10)#实例化显示等待,设置等待时间10秒
s = wait.until_not(expected_conditions.title_is(tr),'出错了')#对比title
print(s)

因为title肯定一致,返回的是True,所以until_not()肯定不会对。会一直等待着,直到10秒结束。可以改成until()再看下。

隐式等待

WebDriver类下的implicitly_wait()方法可以设置隐式等待。这个只会在脚本进行元素定位相关的时候执行,会在设置的时间内不断的判断这个元素是否被找到了

from selenium import webdriver
from time import ctime
dr = webdriver.Chrome()
dr.maximize_window()
dr.implicitly_wait(10)
try:
dr.get("https://www.baidu.com")#打开百度
print(ctime())
tr = dr.find_element_by_id('kw123')
except BaseException as f:
print(f)
print(ctime())
finally:
dr.close()

因为没有一个id是叫kw123,所以肯定会找不到,通过秒数可以看到等待了10秒。

一般这个用的比较多,在浏览器初始化之后设置。之后所有定位元素的操作,都会有等待时间的设置。

python3+selenium入门07-元素等待的更多相关文章

  1. selenium webdriver——设置元素等待

    如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...

  2. Selenium 3----设置元素等待

    在做Web应用的自动化测试时,定位元素必不可少,这个过程经常出现定位不到元素的情况,常见原因有哪些呢? 1.描述错误 提高编写水平.细心 2.Frame/Iframe框架原因 在元素所在框架里定位该元 ...

  3. selenium学习之元素等待(四)

    --为什么要设置元素等待: 目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件.在网页中进行元素定位时, ...

  4. python3+selenium入门05-元素操作及常用方法

    学习了元素定位之后,来看一些元素的操作,还有一些常用的方法 clear()清空输入框内容 click()点击 send_keys()键盘输入 import time from selenium imp ...

  5. python3+selenium入门01-环境搭建

    作为一个测试,在最近两年应该有明显的感觉.那就是工作变的难找,要求变的高了,自动化测试,性能测试等.没有自动化测试能力,只会点点点工作难找不说,工资也不高.所以还是要学习一些技术.首先要学习一门编程语 ...

  6. selenium - webdriver - 设置元素等待

    隐式等待:implicitly_wait(value), value默认是0 from selenium import webdriverfrom selenium.common.exceptions ...

  7. selenium - 三种元素等待

    1.sleep 休眠方法 sleep()由python的time模块提供. 当执行到sleep()方法时,脚本会定时休眠所设置的时长,sleep()方法默认参数是s(秒),sleep(2) 表示休眠2 ...

  8. Python +selenium之设置元素等待

    注:本文转载http://www.cnblogs.com/mengyu/p/6972968.html 当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给元素的定位增加了困难.如果因为在加 ...

  9. python3+selenium入门15-执行JavaScript

    有时有些功能需要通过js来执行,比如拖动浏览器的滚动条.通过execute_script()方法可以执行js的代码 window.scrollTo()可以传两个参数,第一个参数是下方滚动条的位置,第二 ...

随机推荐

  1. linux下查看主板内存槽与内存信息

    1.查看内存槽数.那个槽位插了内存,大小是多少 dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range 2. ...

  2. Java Web服务收到请求时线程的情况

    Web请求线程的状态 在开发中,突然想到了这样的一个问题, Java对每一次Web的请求,是否都会创建一条线程去进行处理呢?也就是说,当一个Class的方法同时有1000个请求访问时,线程是如何运作的 ...

  3. ssh-keygen Linux 免密登录

    一.选择算法和密钥大小 rsa - 基于分解大数的难度的旧算法.RSA建议密钥大小至少为2048位,4096位更好.RSA正在变老,并且在保理方面取得了重大进展.可能建议选择不同的算法.在可预见的将来 ...

  4. JAVA核心技术I---JAVA基础知识(多态)

    一:类转型 类转型:子类可以转父类,父类不可以转子类(除非父类对象本身就是子类) 1.父类 public class Human { public void say() { System.out.pr ...

  5. java版微信公众号支付(H5调微信内置API)

    最近需要做微信公众号支付,网上找了大堆的代码,大多都只说了个原理,自己踩了太多坑,所有的坑,都会再下面的文章中标注,代码我也贴上最全的(叫我雷锋)!!! 第一步:配置支付授权目录 你需要有将你公司的微 ...

  6. eclipse将javaSE项目导出成可执行jar包

    将第三方包和项目打包到一块 step1:选中要导出的项目,右键选择Export step2:选择java/Runable JAR file step3:选择main主程序,选择第三方包打包的形式,推荐 ...

  7. PHP6天基础知识部分

    ---恢复内容开始--- (一).基础(PHP超文本预处理器) 1.PHP标记(2种) 1.<?php?>:大众的用法?和php之间不能有空格否则无效. 2.<??>:小众的用 ...

  8. 虚拟机 the image's hash and certificate are not allowed 解决方案

    根据计划,需要在虚拟机上安装一个linux系统,用作web架构学习的服务器. 公司项目的服务器用的是linux系统,具体版本未知.虽然我们开发不用关注最后的部署,但多少也接触了一些,算是有一定的了解, ...

  9. http的三次握手四次挥手

    http : 是一种超文本传输协议 传输指的是在客户端和服务器之间进行传输数据 http不仅仅可以传输文本,还可以传输图片.音频.视频等内容 https : 是一种更加安全的传输协议 在普通的传输协议 ...

  10. Iterator迭代器

    java.util.Iterator 迭代器iterator,是一个接口,不能够直接使用,需要使用Iterator接口的实现类对象,而获取实现类的的对象的方式为: Collection接口中有一个方法 ...