显示等待是等某个元素加载后再执行后续代码,超过设置的时间,然后抛出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
driver = webdriver.Chrome()
driver.get("https://www.youtube.com/")
try:
# 超时时间为2秒,每0.2秒检查1次,直到元素出现
element = WebDriverWait(driver, 2,0.2).until(EC.presence_of_element_located((By.XPATH, "//*[@id='logo-icon-container']")))
finally:
print("请求超时")
driver.quit()
- driver WebDriver实例 (Ie, Firefox, Chrome or Remote)
- timeout 超时前的秒数, 等待的最长的时间(同时要考虑隐式等待)
- poll_frequency 调用until或until_not中的方法的间隔时间,默认为0.5秒
- ignored_exceptions调用期间忽略异常类,默认只有NoSuchElementException
method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
与until相反,until是当某元素出现或什么条件成立则继续执行,
until_not是当某元素消失或什么条件不成立则继续执行,参数也相同,不再赘述。
那么 WebDriverWait的调用的方法如下
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None).until()
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
这里需要注意的是 until 和 until_not 中的method 参数一定是可以调用的,记这个对象一定有_call_()方法,否则会抛出异常:
TypeError: ‘xxx’ object is not callable
expected_conditions模块中提供了很多可以提供判断的条件:
以下两个条件验证元素是否出现,传入的参数都是元组类型的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
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(20) # 隐性等待,最长等30秒
driver.get('https://www.baidu.com')
driver.quit()
注意:
1.隐性等待的设置时全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成;不需要每次设置一遍;
2.页面加载完成后新打开的弹窗是没有等待效果的
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(3) # 隐性等待,最长等30秒
print(driver.current_url)
driver.quit()
设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点时不智能,设置的时间太短,元素还没有加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了;所以尽量少用这个