我们在做WEB自动化时,经常听到小伙伴说,明明代码没问题,死活定位不到元素,一运行就报错啊。是因为有时候因为网络或其它原因导致我们需要定位的元素还没加载出来,我们代码就执行下一步操作了,这个时候就需要我们在某些场景下加等待时间。
我们平常用到的有三种等待方式:
1、强制等待--就是说不管元素有没有加载出来,必须等3秒钟,时间一到就就执下面代码,导入time模块就可以实现
#!usr/bin/python3
import time
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()# 打开百度首页
driver.get('https://www.baidu.com/')# 强制等待3秒
time.sleep(3)
driver.find_element_by_css_selector("#kw").send_keys("python")# 退出
driver.quit()
2、隐式等待
第二种办法叫隐性等待,implicitly_wait(xx),隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。
#!usr/bin/python3
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()# 打开百度首页
driver.get(r'https://www.baidu.com/')
driver.find_element_by_css_selector("#kw").send_keys("python")
driver.find_element_by_css_selector("#su").click()# 隐式等待30秒
driver.implicitly_wait(30)
result = driver.find_elements_by_css_selector("h3.t>a")for i in result:print(i.text)# 退出
driver.quit()
3、显示等待
第三种办法就是显性等待,WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
主要有4个参数:
driver:浏览器驱动
timeout:等待时间
poll_frequency:检测的间隔时间,默认0.5s
ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException
#!usr/bin/python3
from seleniumimport webdriver
from selenium.webdriver.support.wait importWebDriverWait
driver = webdriver.Chrome()# 打开百度首页
driver.get(r'https://www.baidu.com/')
driver.find_element_by_css_selector("#kw").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()# 超时时间为30秒,每0.2秒检查1次,直到class="tt"的元素出现
text =WebDriverWait(driver, 30, 0.2).until(lambda x:x.find_element_by_css_selector(".tt")).text
print(text)# 退出
driver.quit()
总结:
软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以关注我们码上开始,公众号内会有不定期的发放免费的资料链接,还有同行一起技术交流。这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。