问题:在自动化测试中,必定会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错。另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到 wait。
selenium总共有三种等待方式:
- timd.sleep(固定等待)
- implicitly_wait(隐式等待)
- WebDriverWait(显示等待)
1.固定等待
timd.sleep(固定等待):可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长。该方式适用于脚本调试过程。代码如下所示:
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
# sleep(2)
def test_sleep(self):
self.driver.find_element_by_id('kw').send_keys('selenium')
sleep(2) # 线程阻塞 blocking wait
self.driver.find_element_by_id('su').click()
sleep(3)
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_sleep()
2.隐式等待
implicitly_wait(隐式等待):隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。 代码如下所示:
隐式等待最大的问题是:JavasScript 一般都是放在我们body的最后进行加载,实际这时页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。
from selenium import webdriver
from time import sleep
class TestWait02(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
# sleep(2)
def test_implicitly(self):
self.driver.implicitly_wait(10)
self.driver.find_element_by_id('kw').send_keys('selenium')
# sleep(2) # 线程阻塞 blocking wait
self.driver.find_element_by_id('su').click()
# sleep(3)
self.driver.quit()
if __name__ == '__main__':
case = TestWait02()
case.test_implicitly()
3.显示等待
WebDriverWait(显示等待):指的是设定最长等待时间,有一个判断条件,会每隔设定的时间去执行判断条件是否成立。如果成立则往下执行,否则一直检查条件,直到达到最长等待时间。该方法是最常用的。参数有:
这个模块中,一共只有两种方法 until 与 until not
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait
class TestWait03(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
# sleep(2)
def test_wait(self):
wait = WebDriverWait(self.driver, 2) #2为timeout,即等待的最长时间
wait.until(EC.title_is('百度一下,你就知道'))#直到出现的页面的标题为百度一下,你就知道,poll_frequency为默认值
self.driver.find_element_by_id('kw').send_keys('selenium')
# sleep(2) # 线程阻塞 blocking wait
self.driver.find_element_by_id('su').click()
# sleep(3)
self.driver.quit()
if __name__ == '__main__':
case = TestWait03()
case.test_wait()
转载:https://blog.csdn.net/dingding_ting/article/details/116768566
查看评论