在使用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. Python的基础详情

    Python的基础信息 Python是一种动态解释性高级语言 Python即可面向对象,也可以面向过程 解释行语言 无需编译 程序以'行'为单位进行执行 执行速度慢 开发效率快 可跨平台 编译型语言 ...

  2. 面向对象【林老师版】:__init__定制自己独有的特征(三)

    本节内容 1.是如何产生对象 2.实例化的步骤 3.类即类型 一.是如何产生对象? __init__方法用来为对象定制对象自己独有的特征 1.stu1=LuffyStudent()调用报错 1.代码 ...

  3. Java Web之Http协议

    为什么会出现HTTP协议?有什么用? 浏览器和服务器之间进行数据的沟通的时候,需要标准,浏览器有Chrome浏览器,火狐浏览器,IE浏览器等.服务器有Tomcat服务器,IIS服务器等,由于各自标准不 ...

  4. JAVA核心技术I---JAVA基础知识(异常处理类)

    一:异常分类 Throwable:所有错误的祖先. Error:系统内部错误或者资源耗尽.不用我们管 Exception: 程序有关的异常.重点关注 –RuntimeException: 程序自身的错 ...

  5. NPOI使用教程附Helper

    1 NPOI简介 1.1 NPOI是什么 NPOI是POI的.NET版本,POI是一套用Java写成的库,我们在开发中经常用到导入导出表格.文档的情况,NPOI能够帮助我们在没有安装微软Office的 ...

  6. STM32学习笔记:【001】时钟树与RCC

    导言 如果学过单片机的同学应该不会陌生,学习51单片机时最经常听到的就是“最小系统”. 最小系统里面少不了晶振,否则单片机无法工作. 单片机需要晶振(时钟源)来工作,那么对于STM32芯片同样如此. ...

  7. Maven 本地仓库,远程仓库,中央仓库,Nexus私服,镜像 详解

    一. 本地仓库 本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库.这样在你下次使用的时候就不需要从远程下 ...

  8. ETL脚本的版本管理方法和 SourceTree 使用

    =============================使用git管理Kettle 作业的一个注意=============================之前 ETL 作业是用 svn 管理的, ...

  9. 腾讯云cos封装

    public class CosUtil { int _appId = xxxxx; string _secretId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  10. SSH中使用延迟加载报错Exception occurred during processing request: could not initialize proxy - no Session

    17:40:17,249 ERROR DefaultDispatcherErrorHandler:42 - Exception occurred during processing request: ...