页面等待
现在的网页越来越多采用了Ajax技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出现,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。
为了避免这种元素定位困难而且会提高产生ElementNotVisibleException的概率,所以Selenium提供了两种等待方式:一种是隐式等待;一种是显式等待。
显式等待
显式等待是指定某一条件直到这个条件成立时继续执行。
下表是一些内置的等待条件,可以直接调用这些条件,而不用自己写某些等待条件了。
方法 | 说明 |
title_is | 标题是某内容 |
title_contains | 标题包含某内容 |
presence_of_element_located | 元素加载出,传入定位元组,如(By.ID,’p’) |
visibility_of_element_located | 元素可见,传入定位元组 |
visibility_of | 可见,传入元素对象 |
presence_of_all_elements_located | 所有元素加载出 |
text_to_be_present_in_element | 某个元素文本包含某文字 |
text_to_be_present_in_element_value | 某个元素值包含某文字 |
frame_to_be_available_and_switch_to_it | frame加载并切换 |
invisibility_of_element_located | 元素不可见 |
element_to_be_clickable | 元素可点击 |
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
import time
driver = webdriver.Edge()
driver.get('https://www.jd.com/')
try:
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'search'))
)
print(element)
time.sleep(5)
finally:
driver.quit()
显式等待是在代码中定义等待一定条件发生后再进一步执行代码。
在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。WebDriverWait默认情况下会每500毫秒调用一次ExpectedCondition直到结果成功返回。ExpectedCondition成功的返回结果是一个布尔类型的true或是不为null的返回值。
隐式等待
隐式等待是等待特定的时间。隐式等待比较简单,就是设置一个等待时间,单位为秒。当然如果不设置,默认等待时间为0。
from selenium import webdriver
import time
driver = webdriver.Edge()
driver.implicitly_wait(10)
driver.get('https://jd.com/')
myDynamicElement = driver.find_element_by_id('search')
print(myDynamicElement)
time.sleep(5)
driver.close()
driver.quit()
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。