selenium 的隐式等待和显示等待

等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。

为了避免这种元素定位困难而且会提高产生 ElementNotVisibleException 的概率。所以 Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。

隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。

1.显式等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = ‘http://www.baidu.com‘

driver = webdriver.Firefox()
driver.get(url)

# 设置显示等待
el = WebDriverWait(driver, 60, 0.5).until(EC.presence_of_element_located((By.CSS_SELECTOR,‘#lh > a:nth-child(3)‘)))

print (el.text)

driver.close()

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

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

  • driver :浏览器驱动。
  • timeout :最长超时时间,默认以秒为单位。
  • poll_frequency :检测的间隔(步长)时间,默认为0.5S。
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。 WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。 until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

2.隐式等待

WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。如果不设置隐式等待的值,那么当我们进行元素定位的时候,一旦定位不到将会直接报错出来,而如果我们设置了隐式等待的值,当定位不到元素的时候,程序将在隐式等待设定时间内多次尝试定位元素,当时间超过设定的隐式等待时间,将会报错出来,它的用法相对来说要简单得多。

from selenium import webdriver
import time
url = ‘https://www.amazon.cn/‘

driver = webdriver.Firefox()
driver.get(url)
# 设置隐式等待
driver.implicitly_wait(10)

driver.quit()

implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。

原文地址:https://www.cnblogs.com/a565810497/p/11599602.html

时间: 2024-10-07 21:06:09

selenium 的隐式等待和显示等待的相关文章

Appium隐式等待和显示等待

https://github.com/appium/appium/blob/master/docs/en/commands/session/timeouts/implicit-wait.md 隐式等待:设置一个超时时间,服务端(Appium)在这个时间内会去不断寻找元素,超时找不到时就会报错,他是全局性的driver.implicitly_wait(10) # 10秒driver.manage().timeouts().implicitlyWait(6, TimeUnit.SECONDS); 显

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

代码编译运行环境:VS2012+Debug+Win32 模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始化.模板的实例化分为隐式实例化和显示实例化. 对函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用).对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显

【C++自我精讲】基础系列五 隐式转换和显示转换

0 前言 1)C++的类型转换分为两种,一种为隐式转换,另一种为显式转换. 2)C++中应该尽量不要使用转换,尽量使用显式转换来代替隐式转换. 1 隐式转换 定义:隐式转换是系统跟据程序的需要而自动转换的. 1)C++类型(char,int,float,long,double等)的隐式转换: 算术表达式隐式转换顺序为: 1.char - int - long - double 2.float - double //1)算术表达式 int m = 10; double n = m;//n = 10

ahjesus自定义隐式转换和显示转换

implicit    关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 参考戳此 explicit    关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符. 参考戳此 有一点要注意的是,一个类中不能同时写显式和隐式声明,只能是其中一个. 但是如果声明了隐式的转换,那么其对应的显示转换也会自动提供. 如果声明了显式转换,其对应的隐式转换不会提供的.  ahjesus自定义隐式转换和显示转换

游标(隐式游标与显示游标)

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要提取

C#隐式转换和显示转换举例--C#基础

高精度的数据类型转换为低精度的数据类型是显示转换,低精度的转换为高精度的是隐式转换. 温馨提示:不能说强制类型转换是从低精度到高精度. int a=666;float b=(float)a: 由a到b的转换是低精度到高精度的转换,为隐式转换,但是也加了强制转换(float),当然不加也是对的. 1.隐式转换示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using

||或和&&且的高级用法,以及隐式转换和显示转换。

或的高级用法 console.log(true || true); // true console.log(true || false); // true console.log(false || true); // true console.log(false || false); // false console.log(0 || false); // false console.log(false || 0); // 0 console.log(0 || true); //true con

jq 筛选选择器,方法,隐式迭代 元素显示隐藏 淡入淡出 上拉下拉 动画 类名操作以及样式

jQuery 地址:https://jquery.com/ 历史版本:http://code.jquery.com/ 1.x:兼容 IE678 低版本浏览器 2.x:不兼容 IE678 低版本浏览器 3.x:不兼容 IE678 低版本浏览器,官方主要维护版本 入口函数 // 一下两种入口函数 相当于原生中的 DOMContentLoaded $(function () { /* DOM加载完成的入口*/ }) $(document).ready(function(){ /* DOM加载完成的入口

InnoDB事务锁之行锁-隐式锁转换显示锁举例理解原理

原文地址:http://blog.51cto.com/yanzongshuai/2071677