selenium三种等待方式
很多时候,我们进行元素定位时无法按预期成功定位到元素,但是我们的代码又确保准确无误,那是什么原因呢?
其实,原因很简单,大致分为2种:
1,所定位的元素在frame/iframe中
2,未设置合理的等待
为什么未设置合理等待的时候,很有可能无法正确定位元素呢?
我们知道,代码的执行速度很快很快,但浏览器的渲染速度却相对慢了很多,这就容易导致代码执行完后还未渲染或加载成功过,从而导致无法成功定位元素。
等待分为3种:
1,强制等待
2,隐式等待
3,显示等待
1,强制等待
强制等待是最为粗暴的一种等待方式,此等待方式不管定位结果如何都会一直等待,直到等待时长结束。此种等待方式会导致程序代码中断,当等待时间结束
后才会继续往下执行。
所以,此种等待方式往往会拉低程序执行效率,拉长了测试时长。
在python种,强制等待用sleep()方法,使用此方法需导入time(import)模块或time模块中的sleep()方法(from time import sleep)。
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
sleep(3)
driver.find_element(By.ID, 'kw').send_keys("python")
driver.find_element(By.ID, 'su').click()
sleep(3)
driver.quit()
上图代码中,在打开了百度首页后,sleep3秒,在搜索完成后sleep3秒。
2,隐式等待:implicitly_wait(xx)
隐私等待会在等待时长内等待整个页面的加载完成,如果在等待时长内页面加载完成,则进行下一步。否则会一直等待页面加载完成,直到达到等待时长。
隐式等待的一个明显弊端:一定会等到页面加载完成后才会执行下一步,即使可能元素已经被找到了。
注意:隐性等待对整个driver的周期都起作用,所以只要设置一次即可。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element(By.ID, "kw").send_keys("python")
driver.find_element(By.ID, 'su').click()
既然,隐式等待也可能会导致我们的程序运行速度变慢,那有没有更好的等待方式呢?当然,显示等待就可以。
3,显示等待:WebDriverWait,配合该类的until()和until_not()方法 显示等待会在一定的时间频率上来查看是否定位到了元素,若找到了元素则进行下一步。若未找到,则超时后抛出异常:TimeoutException
WebDriverWait类需要导入:from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait()对象需3个参数:driver, timeout,poll_frequency=POLL_FREQUENCY。
其中:driver为浏览器驱动,timeout为超时时间,poll_frequency为查询频率。
EC为exceped_conditions模块(缩写)调用presence_of_element_located()来判断元素是否已经在页面的DOM中(不需要元素在页面是
可见的),在则返回WebElement对象。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID, 'kw')))
ele.send_keys("python")
从上面示例,会在等待时长10s内,以0.5s的评论查询是否定位到元素(By.ID,'kw'),若定位到元素则停止等待执行下一步,若为找到则抛出
异常。
除了until(),还可以结合until_not()来使用。
重点:理解并熟练使用显示等待,并对涉及到的WebDriverWait类,excepted_conditions模块理解充分。 在webUI自动化中,会对元素的定位进行二次封装,而通常元素的定位就会用到显示等待,并结合try...except来捕获异常。
网友评论