如今大部分web程序使用Ajax技术,当浏览器加载页面时,页面元素可能不是同时加载完成,如果因为加载某个元素超时导致ElementNotVisibleException的情况出现,自动化脚本的稳定性就会降低。

WebDriver 提供了两种类型的等待:显示等待、隐式等待、强制等待

  • 隐式等待(页面加载)

隐式等待是在创建driver时,为浏览器对象创建的一个等待时间。

是在尝试得到某个元素时,得不到就等待固定长度的时间加载全部页面元素。默认设置是0秒。一旦设置了隐式等待时间,它的作用范围就是Webdriver对象实例的整个生命周期。

隐式等待设置是全局等待,分为:

  1. 页面加载超时等待;
  2. 页面元素加载超时;
  3. 异步脚本超时
from selenium import webdriver

driver = webdriver.Chrome()
# 定位对象时,给10s时间,如果10s内还没有定位到,则抛出异常
driver.implicitly_wait(10)
# 设置页面加载超时为10s
driver.set_page_load_timeout(10)
# 异步脚本的超时时间为3s
driver.set_script_timeout(10) driver.get("http://yunpan.360.cn") driver.find_element_by_id("XXX")
  •  显式等待(元素加载)

用于一段代码内,只要等到条件满足,就继续执行,否则就一直等,直到规定时间内都没有达到条件,就抛出异常

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By driver = webdriver.Chrome()
driver.get("http://www.xxx.com")
# 显示等待
element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, 'element_id')))
element.click() driver.quit()

WebDriverWait()
它是由 webdirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

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

  • driver - WebDriver 的驱动程序(Ie, Firefox,Chrome 等)
  • timeout - 最长超时时间,默认以秒为单位
  • poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
  • ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
  • WebDriverWait()一般由 until()(或 until_not())方法配合使用,下面是 until()和 until_not()方法的说明。
    • until(method, message=' ') 调用该方法提供的驱动程序作为一个参数,直到返回值为 Ture。
    • until_not(method, message=' ') 调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

Expected Conditions

expected_conditions 类提供一些预期条件的实现。

  • presence_of_element_located()判断元素是否存在。
  • title_is 用于判断标题是否 xx。
  • title_contains 用于判断标题是否包含 xx 信息。
  • presence_of_element_located 元素是否存在。
  • visibility_of_element_located 元素是否可见。
  • visibility_of 是否可见
  • presence_of_all_elements_located判断一组元素是否存在
  • text_to_be_present_in_element 判断元素是否有 xx 文本信息
  • text_to_be_present_in_element_value 判断元素值是否有 xx 文本信息
  • frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。
  • invisibility_of_element_located 判断元素是否隐藏
  • element_to_be_clickable 判断元素是否点击,它处于可见和启动状态
  • staleness_of等到一个元素不再是依附于 DOM。
  • element_to_be_selected 被选中的元素
  • element_located_to_be_selected 一个期望的元素位于被选中。
  • element_selection_state_to_be一个期望检查如果给定的元素被选中。
  • element_located_selection_state_to_be期望找到一个元素并检查是否选择状态
  • alert_is_present 预期一个警告信息

除了 expected_conditions 所提供的预期方法,我们也可以使用 is_displayed()方法来判断元素是否可见。

#coding=utf-8

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait driver = webdriver.Firefox()
driver.get("http://www.baidu.com") input_ = driver.find_element_by_id("kw")
element = WebDriverWait(driver,5,0.5).until( lambda driver :input_.is_displayed())
input_.send_keys('selenium')
driver.quit()
  • 强制等待

固定休眠

time.sleep(5)

selenium 显示等待、隐式等待、强制等待的更多相关文章

  1. python+selenium基础篇,三种等待方式,显示、隐式、强制等待

    1.显示等待: from selenium import webdriver from time import sleep from selenium.webdriver.support.ui imp ...

  2. python+selenium六:隐式等待

    python+selenium六:隐式等待   # 隐式等待 # 全局生效,只写一次即可(仅当前页面)# 若有页面切换,需sleep等待新页面出现后,再使用此方法 # 如:在35秒内,等待操作完成,完 ...

  3. [Effective JavaScript笔记]第3条:当心隐式的强制转换

    js对类型错误出奇的宽容 3+true;  //4 3*””;  //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...

  4. Intent 显示意图 隐式意图

    //显式意图  :必须指定要激活的组件的完整包名和类名 (应用程序之间耦合在一起) // 一般激活自己应用的组件的时候 采用显示意图  //隐式意图: 只需要指定要动作和数据就可以 ( 好处应用程序之 ...

  5. 转 Python selenium 强制等待显示等待隐式等待

    1. 1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间. 看代码: # -*- codi ...

  6. 【Selenium】显示、隐式等待

    显示等待 WebDriverWait 超时抛出TimeOutException,默认500毫秒 public class WaitToReturnElement { /* * 设置超时时间为5秒,返回 ...

  7. 2.8 (显示、隐式、线程休眠) selenium 等待方式 ❀

    http://blog.csdn.net/pf20050904/article/details/20052485 http://www.cnblogs.com/hellokitty1/p/629584 ...

  8. [selenium webdriver Java]隐式的等待同步

    Selenium WebDriver提供了隐式等待来同步测试.当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定时间后,抛出找不到元素异常 即,当元素没 ...

  9. C#接口的显示和隐式实现

    早上骑车上班走到半路发现手机忘带了,这年代兜里没装一分现金,吃饭都要刷手机,上班时间无聊了不能玩手机更是大问题,所以果断掉头拿手机.取完手机刚出门看这天阴沉沉的貌似要下雨,没雨衣,骑车又不能打伞,上次 ...

  10. JS当心隐式的强制转换

    JavaScript对类型错误出奇的宽容 3 + true; // 4 null + 3; // 3 运算符+(加号)的重载 运算符+既重载了数字相加,又重载了字符串连接操作.具体是数字相加还是字符串 ...

随机推荐

  1. BZOJ-3495 前缀优化建图2-SAT

    题意:有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 解法:以前没学过,参考https://blog.csdn.net/linkf ...

  2. github fork代码后提交

    点击他人github上的fork 在自己的Github上将代码拷贝下来 git clone 在本地修改代码后创建分支 git checkout -b work master(work为新建的特性分支, ...

  3. Jmeter-【JSON Extractor】-响应结果中数组多个相同key取值

    一.请求返回样式 二.取所有option的值 三.查看结果

  4. Vue学习笔记【25】——Vue组件(组件间传值)

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据  <script>    // 创建 Vue 实例,得到 ViewModel    var ...

  5. go声明和初始化

    go声明和初始化 当我们第一次看见变量和声明时,我们仅仅看见一些内置的类型,比如整型和字符串.现在我们将学习结构体,并且我们会深入学习包括指针的内容. 通过一种最简单的方式去创建一个结构体值类型: g ...

  6. 区间dp(二维)——cf1199F

    复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移 #include<bits/stdc++.h> using namespace std; #define N 55 in ...

  7. pandas中读取文件报错

    import pandas as pd fileName = "路径中带有中文/xxx.csv" tf_train = pd.read_csv(fileName) 会提示报错 OS ...

  8. unittest框架学习笔记三之testsuite

    # coding=utf-8 '''created :2018/3/29 author:star project: testsuite'''import unittest,time,osfrom ba ...

  9. CSS:百科

    ylbtech-CSS:百科 1.返回顶部 CSS (层叠样式表) 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标 ...

  10. jeecg接口开发及权限实现原理

    接口开发使用的框架 jeecg本身是基于 Spring MVC 框架搭建的,因此,使用 Spring MVC 框架的 RESTful API 功能来进行接口开发就是顺理成章的事了. 接口的拦截与鉴权 ...