引言:

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

注:当使用该放发的时候可以参照这个视频

https://www.bilibili.com/video/av19057145/?p=16

正文:

1.强制等待(sleep)

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

2.隐性等待(implicitly_wait())

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

# -*- coding: utf-8 -*-

fromselenium 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 -*-

fromselenium import webdriverfromselenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions asECfromselenium.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.title

title_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,一个判断元素的value

text_to_be_present_in_element

text_to_be_present_in_element_value

这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement

frame_to_be_available_and_switch_to_it

这个条件判断是否有alert出现

alert_is_present

这个条件判断元素是否可点击,传入locator

element_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 selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)相关推荐

  1. python等待网页加载_Python Selenium等待(waits)页面加载完成的三种方法

    从网上load的: 网页常常会因为网络原因,程序问题等等导致打开网页慢,一直在那里打圈圈. 出现这种情况时网页里的很多元素就没有加载完成,如果你刚好要定位的元素没有加载完,这时定位的话程序就会抛出异常 ...

  2. java等待页面加载_java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  3. webdriver 等待页面加载完成_Python爬虫,登陆神器Selenium等待(waits)页面加载的三种方法...

    网页常常会因为网络原因,程序问题等等导致打开网页慢,一直在那里打圈圈. 出现这种情况时网页里的很多元素就没有加载完成,如果你刚好要定位的元素没有加载完,这时定位的话程序就会抛出异常. 所以程序里要加入 ...

  4. java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  5. python3读取网页_python3+selenium获取页面加载的所有静态资源文件链接操作

    软件版本: python 3.7.2 selenium 3.141.0 pycharm 2018.3.5 具体实现流程如下,废话不多说,直接上代码: from selenium import webd ...

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

    现在的大多数的Web应用程序是使用Ajax技术.当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载.这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVis ...

  7. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  8. python数据加载常规教程_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  9. 异步加载js的三种方法

    js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...

最新文章

  1. html 访问 php 变量
  2. Linux 下安装和配置git
  3. 【二分】数列分段(ybtoj 二分-1-1)
  4. 关于Zend framework 里一段代码的疑问
  5. i5+GT730+B85安装OSX10.10.5 (Yosemite Install(14F27).cdr)
  6. [转]# python中init和new的区别
  7. linux下磁盘及文件系统基础知识(1)
  8. steam搬砖项目超完整版实操免费分享
  9. 多传感器融合用卡尔曼滤波的话也逃不开状态方程观测方程
  10. 一文说清 Linux System Load
  11. 学生图书馆系统mysql数据库设计
  12. 百度地图api 在3D地图中设置自定义样式
  13. 《STL源码剖析》RB-tree中increment 和 decrement 的作用
  14. 解决elasticsearch里拒绝更新mapping设置的错误
  15. 3dmax2020软件安装教程【搬运转载】
  16. Youtube推荐系统论文-《Deep Neural Networks for YouTube Recommendations》-简单总结
  17. 小米拒绝权限_小米应用商城:我下载的是快图,打开却是天天相册,还发扣费短信...
  18. 《白帽子讲web安全》学习笔记(第一篇)
  19. 雪糕大军纷纷网红出道,“天价”背后是什么让消费者买单?
  20. oracle开放查询表权限_Oracle创建用户并给用户授权查询指定表或视图的权限

热门文章

  1. jQuery构建路由
  2. python迭代列表_迭代建立列表的最python方法?
  3. java技术栈有哪些_Java程序员必备的21个核心技术,你都掌握了哪些?
  4. MySQL初始化zabbix_【Zabbix】CentOS6.9系统下部署Zabbix-server 3.0
  5. ercp手术为什么那么贵_尼泊尔佛像为什么那么贵?
  6. linux下的定时任务处理
  7. html5金牌榜,member-Grading.html
  8. mysql 删除线程_mysql删除阻塞线程
  9. mysql集群session_Jetty9.2.2集群Session共享
  10. Linux 如何取进程运行时间,linux -- 获取进程执行时间