我们在做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()
回到顶部
一、强制等待
利用time模块的sleep方法来实现,最简单粗暴的等待方法
代码:
# coding = utf-8from time import sleep from selenium import webdriver # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器 driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页 driver.get(r'https://www.baidu.com/')# 等待3秒 sleep(3) driver.find_element_by_css_selector("#kw").send_keys("selenium")# 退出 driver.quit()
这种叫强制等待,不管你浏览器是否加载完成,都得给我等待3秒,3秒一到,继续执行下面的代码,不建议用这种等待方法,严重影响代码的执行速度
回到顶部二、隐式等待
设置一个等待时间,如果在这个等待时间内,网页加载完成,则执行下一步;否则一直等待时间截止,然后再执行下一步。这样也就会有个弊端,程序会一直等待整个页面加载完成,直到超时,但有时候我需要的那个元素早就加载完成了,只是页面上有个别其他元素加载特别慢,我仍要等待页面全部加载完成才能执行下一步。
代码:
# coding = utf-8from selenium import webdriver # 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器 driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页 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秒 driver.implicitly_wait(30) result = driver.find_elements_by_css_selector("h3.t>a")for i in result:print(i.text)# 退出 driver.quit()
回到顶部
三、显示等待
上面我们说了隐式等待的一个弊端,如果我想等我要的元素一加载出来就执行下一步,该怎么办?这里就要用到显示等待
显示等待要用到webdriverwait
from selenium.webdriver.support.wait importwebdriverwait
配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思就是:程序每隔xx检查一次,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
我们先看一下webdriverwait的帮助文档:
>>> help(webdriverwait)Help on classwebdriverwaitinmodule selenium.webdriver.support.wait:classwebdriverwait(builtins.object)|Methodsdefined here:||__init__(self, driver, timeout, poll_frequency=0.5, ignored_exceptions=None)|Constructor, takes a WebDriver instance and timeout in seconds.||:Args:|- driver -Instance of WebDriver(Ie,Firefox,ChromeorRemote)|- timeout -Number of seconds before timing out|- poll_frequency - sleep interval between calls |Bydefault, it is0.5 second.|- ignored_exceptions - iterable structure of exception classes ignored during calls.|Bydefault, it contains NoSuchElementException only.||Example:|from selenium.webdriver.support.ui importwebdriverwait|| element =webdriverwait(driver,10).until(lambda x: x.find_element_by_i d("someId"))|| is_disappeared =webdriverwait(driver,30,1,(ElementNotVisibleExcepti on)).\ || until_not(lambda x: x.find_element_by_id("someId").is_displ ayed())
主要有4个参数:
driver:浏览器驱动
timeout:等待时间
poll_frequency:检测的间隔时间,默认0.5s
ignored_exceptions:超时后的异常信息,默认抛出NoSuchElementException
代码:
# coding = utf-8from selenium import webdriver from selenium.webdriver.support.wait importwebdriverwait# 驱动文件路径 driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'# 启动浏览器 driver = webdriver.Chrome(executable_path=driverfile_path)# 打开百度首页 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()
总结:
软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以关注我们码上开始,公众号内会有不定期的发放免费的资料链接,还有同行一起技术交流。这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
关注 - 12
粉丝 - 50 +加关注 1 0 « 上一篇: selenium:Xpath定位详解
» 下一篇: Selenium:八种元素定位方法 posted @ 2018-12-25 14:49 柠檬不萌! 阅读(2928) 评论(2) 编辑 收藏
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。