Selenium 元素等待
- 在做web自动化测试时,有些时候需要等待页面上的元素加载完之后,才能操作,不然元素定位就会超时,程序就会抛出
ElementNotVisibleException
异常。
1. 强制等待 sleep
sleep()
是time
模块中的方法,用来做强制等待,- 缺点:不管元素有没有加载出来,它都会等待这么久,会造成元素已经加载出来了,但是由于设置等待时间的原因,还会在等待中,效率低,还有一种就是元素还没有加载出来,但是等待的时间已经到,就不在等待,代码就会报错
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
web01 = driver.find_element_by_xpath('//input[@id="kw"]')
web01.send_keys("天气预报")
2. 隐式等待 implicitly_wait
- implicitly_wait()是webdriver 中的方法,使用隐式等待,在一个模块中定位每个元素的时候都会自动调用隐式等待,当调用的元素加载出来以后,隐式等待就不会在等待了,超过设置的等待时间,就会报错
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://wwww.baidu.com")
driver.implicitly_wait(20)
web01 = driver.find_element_by_xpath('//*[@class="s_ipt" and @name="wd"]')
web01.send_keys("python")
3. 显示等待WebDriverWait
- WebDriverWait() 在指定的时间范围内,等待到符合的元素,每隔x秒去判断一下指定的元素是否加载完,如果超时则抛出异常
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
'''
第一个参数:驱动
第二个参数:超时时间
第三个参数:轮训时间
'''
wait = WebDriverWait(driver, 30, 0.2)
locator01 = ("xpath", "//input[@id='kw']")
ec01 = EC.element_to_be_clickable(locator01)
ec02 = wait.until(ec01)
print(ec02)