python自动化等待时间_Python+Selenium自动化篇-8-设置等待三种等待方法

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-24 06:02   57   0

如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现因为元素未加载导致的错误的出现。

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

1.显示等待:WebDriverWait()类

显示等待:设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就提示一个超时异常(TimeoutException)。

通常情况下WebDriverWait类会结合ExpectedCondition类一起使用。

实例:

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.Chrome()

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

# 设置浏览器:driver 等待时间:20s

wait = WebDriverWait(driver, 20)

# 设置判断条件:等待id='kw'的元素加载完成

input_box = wait.until(EC.presence_of_element_located((By.ID, 'kw')))

# 在关键词输入:关键词

input_box.send_keys('关键词')

WebDriverWait的具体参数和方法:

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

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

until(method,message='')

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

until_not(method,message='')

until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,

until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

method

message

ExpectedCondition

ExpectedCondition中可使用的判断条件:

from selenium.webdriver.support import expected_conditions as EC

# 判断标题是否和预期的一致

title_is

# 判断标题中是否包含预期的字符串

title_contains

# 判断指定元素是否加载出来

presence_of_element_located

# 判断所有元素是否加载完成

presence_of_all_elements_located

# 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,传入参数是元组类型的locator

visibility_of_element_located

# 判断元素是否可见,传入参数是定位后的元素WebElement

visibility_of

# 判断某个元素是否不可见,或是否不存在于DOM树

invisibility_of_element_located

# 判断元素的 text 是否包含预期字符串

text_to_be_present_in_element

# 判断元素的 value 是否包含预期字符串

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

#判断元素是否可点击

element_to_be_clickable

# 判断元素是否被选中,一般用在下拉列表,传入WebElement对象

element_to_be_selected

# 判断元素是否被选中

element_located_to_be_selected

# 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,否则返回False

element_selection_state_to_be

# 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,否则返回False

element_located_selection_state_to_be

#判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了

staleness_of

调用方法如下:

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

2.隐式等待

implicitly_wait(xx):设置等待时间为xx秒,等待元素加载完成,如果到了时间元素没有加载出,就抛出一个NoSuchElementException的错误。

注意:隐性等待对整个driver的周期都起作用,所以只要设置一次即可。

from selenium import webdriver

driver = webdriver.Chrome()

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

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

print(driver.current_url)

print(driver.title)

3.强制等待:sleep()

强制等待:不管浏览器元素是否加载完成,程序都得等待3秒,3秒一到,继续执行下面的代码。

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

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

sleep(3) # 强制等待3秒再执行下一步

print(driver.title)

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP