在元素定位的过程中我们少不了要加入等待时间,
如time.sleep(n) ----强制等待
这但是这种方法并不是时时都凑效的,有时候加入了等待的时间但也没有能定位到我们想要的元素(时间太短没有加载出来也定位不到,时间太长很影响执行效率)。而且这种等待时间是定死的,不管有没有加载出来都要等待那么久的时间,很影响用例执行的效率,那么还有没有其它更有效的等待方法。
如implicitly_wait()--隐性等待,设置一个时间,在一定时间内网页是否加载完成 ,如果加载完成则进行下一步,如果没有加载完成则会报加载超时。
这种方法是一种隐式的等待方法,在一定程度上节省了很多时间,但是也是有弊端的,如在一些js页面上无法加载出来时(但其实我们要的元素已经加载完成了),这个时候会是一直是等待的。
再看另一种更有效的等待方法:
WebDriverWait---显性等待
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.Firefox()
driver.get('https://huilansame.github.io')
WebDriverWait(driver,20,0.5).until(
EC.presence_of_element_located((By.LINK_TEXT,'CSDN'))) #每隔0.5秒就去查询一次元素是否出现,如果出现就停止等待,如果没有出现就继续等待,如果等待时间超过了20秒,则报超时异常。
print(driver.find_element_by_link_text('CSDN').get_attribute('href'))
driver.close()
DriverWait有两种方法:
until() ----等待元素出现
until_not() ----等待元素消失
用法:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 等待元素出现:until()
# 等待时长10秒,默认每0.5秒询问一次
WebDriverWait(driver,10,0.5).until(lambda x: x.find_element_by_id("kw")).send_keys("boke")
# 等待元素消失:until_not()
is_disappeared = WebDriverWait(driver,10,1).\
until_not(lambda x: x.find_element_by_id("kw666").is_displayed()) #判断一个不存在的元素,如果是判断一个存在的元素会报异常
print(is_disappeared)