现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。

Selenium Webdriver 提供两种类型的waits - 隐式和显式。显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。而隐式等待让Webdriver等待一定的时间后再才是查找某元素

当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待了,等待元素可见再继续运行程序;

1.强制等待(sleep)

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点时不智能,设置的时间太短,元素还没有加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了;所以尽量少用这个

2.隐性等待(implicitly_wait())

driver.implicitly_wait(),隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载;# -*- coding: utf-8 -*-

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.implicitly_wait(20) # 隐性等待,最长等30秒

driver.get('https://www.baidu.com')

time.sleep(3)

driver.quit()

缺点也是不智能,因为随着ajax技术的广泛应用,页面的元素往往都可以时间局部加载,也就是在整个页面没有加载完的时候,可能我们需要的元素已经加载完成了,那就么有必要再等待整个页面的加载,执行进行下一步,而隐性等待满足不了这一点;

另外一点,隐性等待的设置时全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成;不需要每次设置一遍;

3.显性等待(WebDriverWait)WebDriverWait(driver,20,0.5).until(expected_conditions.presence_of_element_located(locator)),

selenium中的wait模块的WebDriverWait()方法,配合until或者until_not方法,再辅助以一些判断条件,就可以构成这样一个场景:每经过多少秒就查看一次locator的元素是否可见,如果可见就停止等待,如果不可见就继续等待直到超过规定的时间后,报超时异常;当然也可以判断某元素是否在规定时间内不可见等等的各种场景吧,需要根据你自己实际的场景选择判断条件;# -*- coding: utf-8 -*-

from selenium import webdriver

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

driver = webdriver.Firefox()

driver.get('https://huilansame.github.io')

WebDriverWait(driver,20,0.5).until(

EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))

print driver.find_element_by_link_text('CSDN').get_attribute('href')

driver.close()expected_conditions模块中提供了很多可以提供判断的条件:selenium.webdriver.support.expected_conditions(模块)这两个条件类验证title,验证传入的参数title是否等于或包含于driver.titletitle_is

title_contains这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')

顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行presence_of_element_located

presence_of_all_elements_located这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement

第一个和第三个其实质是一样的visibility_of_element_located

invisibility_of_element_located

visibility_of这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的valuetext_to_be_present_in_element

text_to_be_present_in_element_value这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElementframe_to_be_available_and_switch_to_it这个条件判断是否有alert出现alert_is_present这个条件判断元素是否可点击,传入locatorelement_to_be_clickable这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组

第三个传入WebElement对象以及状态,相等返回True,否则返回False

第四个传入locator以及状态,相等返回True,否则返回False

element_to_be_selected

element_located_to_be_selected

element_selection_state_to_be

element_located_selection_state_to_be最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了staleness_of

我是一个值得您关注,期待的公众号,如果对您有帮助,可以点一下赞,或者点一下广告,或者在看也行,留下您的足迹,非常感谢

python如何校验页面元素是否加载完毕_爬虫(八十七)等待页面加载完成(Waits)...相关推荐

  1. 页面加载完毕_【前端面试】dom 的解析,加载,渲染

    本文会把 dom 的解析,加载,渲染结合 window.performance 一起讲. dom 的解析 解析:HTMl 解析器把 HTML 构建成 HTML 树形数据结构,也就是 DOM 树. 注意 ...

  2. springboot配置文件加载顺序_「SpringBoot系列」配置文件加载优先级解析

    SpringBoot提供了外部分配置功能,可以使用属性文件(properties).YAML(yml)文件.环境变量和命令行参数来进行处部参数配置,并t以特定的顺序来处理配置,以便于允许合理的覆盖值. ...

  3. 一加7充电_刘作虎:一加7没有无线充电,Dash是最好的快充之一

    爱搞机2月27日消息,日前,外媒CNET采访了一加创始人刘作虎,刘作虎透露,下一代一加手机没有无线充电功能,这里应该指一加7. 一加7没有无线充电,可能是一加想控制新旗舰的成本,当然这并不代表一加手机 ...

  4. html5页面下拉加载更多_使您的产品页面销售更多的5条提示

    html5页面下拉加载更多 Getting visitors to your website requires a great deal of work and, for many businesse ...

  5. uni 页面加载完毕_uniapp小程序如何等待数据回来才加载页面?

    在app.vue中onLaunch请求, 但是要等待数据回来才加载页面, 这个如何控制, 比如: vue 可以在上级路由加v-if 请求完成判断, 但是uni-app 这种如何控制呢? vue 代码如 ...

  6. h5首页加载慢_近期iOS打开H5页面非常慢的原因

    事件由来 如果最近发现iOS APP打开h5非常慢,达到5秒以上,而安卓又正常,如果刚好你又是使用了Let's Encrypt 的免费SSL服务,恭喜你,你可能是一位运营商干扰的受害者. 有一群吃瓜群 ...

  7. vue 获取元素在浏览器的位置_前端开发JS获取页面元素的位置

    1.网页的大小和浏览器窗口的大小 一张网页的全部面积,就是它的大小.通常情况下,网页的大小由内容和 document元素的clientHeight和clientWidth属性,就代表了网页的大小. f ...

  8. python 判断列表所有元素是否为某个值_这应该是最详细的Python入门基础语法总结!...

    这应该是最详细的Python入门基础语法总结! 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 input 用户自己输入值 print 打印值 可以输出多个变量 %d|%s 用于输 ...

  9. outlook 加载配置项_如何在Outlook中启用加载项和连接器

    outlook 加载配置项 There are a lot of third-party add-ins and connectors available for Outlook. What's th ...

最新文章

  1. Bit-Scalable Deep Hashing with Regularized Similarity Learning for Image Retrieval and Person Re-ide
  2. PMCAFF出品|十一月30篇爆款文章合集,干货、技能、内涵齐飞,总有一款适合你
  3. 深入理解C语言变量和内存——整理篇
  4. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
  5. thinkphp mysql desc table_数据库表结构_ThinkPHP 数据库表结构处理类(简单实用)-云栖社区-阿里云...
  6. python多进程存储数据_python – 多进程还是多线程? – 并行化数百万次迭代的简单计算并将结果存储在单个数据结构中...
  7. [memory]虚拟地址空间分布
  8. 95后人才吸引力城市排名发布,深圳位居全国第二
  9. 4月第一个惊喜:iPhone 9现已直接上架苹果中国官网?
  10. 微服务升级_SpringCloud Alibaba工作笔记0013---SpringCloud Alibaba简介
  11. 【学习OpenCV4】如何操作图像中的像素?
  12. 长阳土家族自治县政府与升哲科技达成战略合作
  13. 使用Qt学习C语言编程2(加入工具链)
  14. SiamCAR: Siamese Fully Convolutional Classification and Regression for Visual Tracking
  15. 异构服务器 微服务_微服务架构是什么?
  16. ARFoundation之路-平面管理
  17. 企业采购季选好开发板平台 迅为4418开发板
  18. 网龙3D人物部件制作工艺介绍
  19. 抓取全国行政区划(PHP)代码
  20. 查看端口信息netstat,查看ip,连接端口

热门文章

  1. vue 中使用 cesium
  2. 数字图像处理第六章——彩色图像处理(上)
  3. 第26课:谈谈我对设计原则的思考
  4. php_curl.dll下载,php_curl.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  5. MySQL各数据类型总结
  6. 安装交叉编译工具:arm-himix200-linux
  7. 计算机软件工程大学排名(2015)
  8. xshell 使用pem文件登录阿里云等远程服务器
  9. 联邦学习实战-2-用FATE从零实现横向逻辑回归
  10. Connecting the Dots: Multivariate Time Series Forecasting with Graph Neural Networks