隐式等待的暗中认可时间是0.

 (一) 前言

出人意料的财富受限或网络延迟,或者招致找不到目的成分,这时候测验报告会展现测量试验战败。那个时候须求意气风发种延时机制,来使脚本的运营速度与程序的响应速度相匹配,WebDriver为这种气象提供了隐式等待和显式等待二种机制。

(二) 隐式等待

如若设置隐式等待时间,就能够作用于这么些WebDriver实例的万事生命周期(对具备的要素查找都见效卡塔尔,设置隐式等待时间后,Webdriver会在洗颈就戮时间内不断质量评定和搜索DOM,以便于查找二个或五个不是当下加载成功并可用的要素。隐式等待的默许时间是0.
WebDriver使用implicitly_wait()来设置等待时间,单位秒。超过等待时间尚未找到,就报NoSuchElementException非凡。

#设置超时时间为10秒

driver.implicitly_wait(10)

(三) 显式等待

WebDriver提供了WebDriverWait类和expected_conditions模块来兑现显式等待。相比隐式等待,突显等待进一层智能。彰显等待正是设置一个内置条件,在等待时间内,每间隔风度翩翩段时间检查一回停放条件是还是不是满足,满足则试行下一步,超时则报TimeoutException分外。

(四) WebDriverWait类

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

driver:浏览器驱动实例

timeout:等待时间,单位秒

poll_frequency:每隔多长时间检查一次,默认0.5秒

ignored_exceptions:忽略的异常,默认只有NoSuchElementException

until方法 和 until_not方法:

until(method, message=''):method指要执行的方法(等待时间内每隔一段时间,执行一次),直到返回值为true,超时则报TimeoutException异常,message将传入异常(message参数可不填)

until_not(method, message=卡塔 尔(阿拉伯语:قطر‎:直到重临值为false,其余和until相通

(五) expected_conditions模块

  
 expected_conditions模块提供了各种定义好的放到条件,供给优秀WebDriverWait使用。

预期等待条件(前置条件)

简单说明

element_to_be_clickable(locator)

参数:locator,指一组(By,locator)

例如:WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.NAME,'11')))
下面的都是以这种方式,只是前置条件不同,传的参数也可能不同
WebDriverWait(driver,10).until()
等待查找的元素可见并且可用,以便可以点击,返回定位到的元素

 

element_to_be_selected(locator)
等待直到元素被选中
invisibility_of_element_located(locator)

 

等待一个元素在DOM中不可见 或不存在

 

presence_of_all_elements_located(locator)

 

等待至少有一个定位器查找的元素出现在网页中,返回一组元素

 

presence_of_element_located(locator)

 

等待定位器查找的元素出现在网页中,或者可以在DOM中找到,返回一个被定位到的元素

 

text_to_be_present_in_element(locator,text)
参数:text,指定的文本
等待元素能被定位,并且带有指定的文本信息
 
title_contains(title)
参数:title,指要校验标题包含的字符串
等待网页标题包含指定的字符串,成功时返回True,否则返回false
 
title_is(title)
参数:title,指要校验的标题
等待网页标题与预期一致,成功时返回True,否则返回false
 
visibility_of(element)
参数:element,指一个元素
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素(同一个)
 
visibility_of_element_located(locator)
 
等待元素出现在DOM中,是可见的,并且宽和高都大于0,变为可见的,将返回一个元素
 
alert_is_present()
 
判断是否存在警告窗口

 

(六) expected_conditions 示例

上边的代码,try:
部分,每风流洒脱某个都以独自可用的(笔者只是表达差别前置条件的用法后就注释掉卡塔尔。别的这里只对章程的利用方式(方法的效率卡塔 尔(阿拉伯语:قطر‎进行认证,不对使用处境实行验证(举个例子有未有须要这么做怎么着的卡塔 尔(英语:State of Qatar)。

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions
 4 from selenium.webdriver.common.by import By
 5 
 6 driver = webdriver.Firefox()
 7 driver.maximize_window()
 8 driver.get('https://www.cnblogs.com/')
 9 
10 # try:
11 #     #等待博客园首页的【找找看】按钮可见并可用
12 #     search_btn = WebDriverWait(driver,10).until(expected_conditions.element_to_be_clickable((By.CLASS_NAME,'search_btn')))
13 #     print(search_btn.get_attribute('value'))
14 
15 # try:
16 #     login_area = driver.find_element_by_css_selector('#login_area')
17 #     login = login_area.find_element_by_link_text('登录')
18 #     login.click()
19 #     remember_me = driver.find_element_by_id('remember_me')
20 #     remember_me.click()
21 #     #等待直到登录页面的复选框被选中
22 #     WebDriverWait(driver, 10).until(expected_conditions.element_located_to_be_selected((By.ID, 'remember_me')))
23 
24 # try:
25 #     search_file = driver.find_element_by_id('zzk_q')
26 #     search_btn = driver.find_element_by_class_name('search_btn')
27 #     search_file.send_keys('python')
28 #     search_btn.click()
29 #     #网页标题是否包含 python
30 #     WebDriverWait(driver, 10).until(expected_conditions.title_contains('python'))
31 
32 try:
33     search_file = driver.find_element_by_id('zzk_q')
34     #检查元素是否出现在DOM中,是可见的,并且宽和高都大于0
35     search_file = WebDriverWait(driver,10).until(expected_conditions.visibility_of(search_file))
36     print(search_file)
37 finally:
38     driver.quit()

 

(七) 演示(自定义前置条件卡塔尔

expected_conditions类提供了两种定义好的停放条件(预期等待条件卡塔 尔(英语:State of Qatar),未有松开条件吻适当时候,也足以透过WebDriverWait自定义后置条件。

上边那一个是WebDriverWait类自带的有的注释。

class WebDriverWait(object):
    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
        """
           Example:
            from selenium.webdriver.support.ui import WebDriverWait n
            element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId")) n
            is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)). n
                        until_not(lambda x: x.find_element_by_id("someId").is_displayed())
        """

示范:(等待和讯个人主页(点击首页的园子跳转到的页面卡塔 尔(英语:State of Qatar)的下拉菜单有5个可采纳卡塔 尔(英语:State of Qatar)

#lambda说明式其实便是七个佚名函数,冒号左侧的可以领略为函数名及参数,侧边的能够清楚为函数的重返值,具体能够百度python
lambda

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select

profile = webdriver.FirefoxProfile
    (r'C:UsersquanhuaAppDataRoamingMozillaFirefoxProfilestnwjkr4m.selenium')
driver = webdriver.Firefox(profile)
driver.maximize_window()
driver.get('https://home.cnblogs.com/')
try:
    #等待 博客园个人主页中的下拉菜单有5个可选项
    WebDriverWait(driver,10).until(lambda l:len(Select(l.find_element_by_id('sel_application')).options) == 5)
finally:
    driver.quit()

(八) 总结

运用成分等待机制,对于营造中度牢固可相信的测量检验是少不了的。在动用过程中,应该尽量防止隐式等待和展现等待混合使用。至于隐式等待和体现等待的利弊,看书上和互连网通常是比较推荐应用彰显等待,然则自个儿要好试了下,暂且是没见到在运营速度方面有多大分别(也许等随后有相比较丰盛的项目资历后,再回头来讲说隐式等待和呈现等待的得失卡塔 尔(阿拉伯语:قطر‎。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website