0


python自动化测试selenium核心技术三种等待方式

UI自动化测试过程中,可能会出现因测试环境不稳定、网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利执行。

selenium官网手册:Waits | Selenium

slenium自动化测试中,主要涉及三种等待方式:

1 使用python自带模块time的sleep方式

缺点:即使网络条件较好时,依旧按照预定固定时间等待,一般不建议使用,脚本调试可使用。

示例脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from
selenium 
import
webdriver
from
time 
import
sleep
class
TestWait(
object
):
    
driver 
=
webdriver.Chrome()
    
driver.get(http:
/
/
www.baidu.com) 
    
def
test_sleep(
self
):
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"sleep test"
)
        
# sleep(2) #等待固定时间
        
self
.driver.implicitly_wait(
2
)  
# 隐式等待
        
self
.driver.find_element_by_id(
"su"
).click()
        
self
.driver.quit()
if
__name__ 
=
=
'__main__'
:
    
wait
=
TestWait()
    
wait.test_sleep()

2 隐式等待(implicitly_wait)

隐式等待设置的时间是最长的时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。

注意:隐式等待对driver整个周期都起作用,一般在最开始设置一次就可以了。不要当做固定等待,哪里都设置隐式等待。

示例脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

from
selenium 
import
webdriver
from
time 
import
sleep 
class
TestWait(
object
):
    
driver 
=
webdriver.Chrome()
    
driver.get(http:
/
/
www.baidu.com) 
    
def
test_sleep(
self
):
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"sleep test"
)
        
self
.driver.implicitly_wait(
2
)  
# 隐式等待
        
self
.driver.find_element_by_id(
"su"
).click()
        
self
.driver.quit()
if
__name__ 
=
=
'__main__'
:
    
wait
=
TestWait()
    
wait.test_sleep()

3 显示等待(WebDriverWait)

显式等待允许等待条件的发生,所以非常适合在浏览器及其DOM和WebDriver脚本之间同步状态。

需要引入包:from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait参数说明:

WebDriverWait(driver, timeout=3).until(some_condition)

两种方法:until和util_not

场景:

打开百度首页,等待页面标题出现:百度一下,你就知道,再执行输入搜索关键词,点击“百度一下”按钮。

示例脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from
selenium 
import
webdriver
from
selenium.webdriver.support.wait 
import
WebDriverWait
from
selenium.webdriver.support 
import
expected_conditions as ec
class
TestWait(
object
):
    
def
setup(
self
):
        
self
.driver 
=
webdriver.Chrome()
        
self
.driver.get(http:
/
/
www.baidu.com) 
    
def
test_webdreiverwait(
self
):
        
webdreiverwaits 
=
WebDriverWait(
self
.driver,
2
)
        
webdreiverwaits.until(ec.title_is(
"百度一下,你就知道"
))
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"test_webdreiverwait test"
)
        
self
.driver.find_element_by_id(
"su"
).click() 
    
def
teardown(
self
):
        
self
.driver.quit() 
if
__name__ 
=
=
'__main__'
:
    
wait
=
TestWait()
    
wait.test_webdreiverwait()

三种等待完整示例脚本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

from
selenium 
import
webdriver
from
time 
import
sleep
from
selenium.webdriver.support.wait 
import
WebDriverWait
from
selenium.webdriver.support 
import
expected_conditions as ec
class
TestWait(
object
):
    
def
setup(
self
):
        
self
.driver 
=
webdriver.Chrome()
        
self
.driver.get(
"http://www.baidu.com"
)
     
def
test_sleep(
self
):
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"sleep test"
)
        
sleep(
2
) 
#等待固定时间
     
self
.driver.find_element_by_id(
"su"
).click()  
    
def
test_implicitly(
self
):
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"implicitly test"
)
        
self
.driver.implicitly_wait(
2
)  
# 隐式等待
     
self
.driver.find_element_by_id(
"su"
).click() 
    
def
test_webdreiverwait(
self
):
        
webdreiverwaits 
=
WebDriverWait(
self
.driver,
2
)
        
webdreiverwaits.until(ec.title_is(
"百度一下,你就知道"
))
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"test_webdreiverwait test"
)
        
self
.driver.find_element_by_id(
"su"
).click() 
    
def
teardown(
self
):
        
self
.driver.quit() 
if
__name__ 
=
=
'__main__'
:
    
wait
=
TestWait()
    
# wait.test_sleep()
    
# wait.test_implicitly()
    
wait.test_webdreiverwait()

【常见问题】:运行脚本报empty suite:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from
selenium 
import
webdriver
from
time 
import
sleep
class
TestWait(
object
):
    
def
__init__(
self
):
        
self
.driver 
=
webdriver.Chrome()
        
self
.driver.get(
'http://www.baidu.com'
) 
    
def
test_sleep(
self
):
        
self
.driver.find_element_by_id(
"kw"
).send_keys(
"sleep test"
)
        
# sleep(2) #等待固定时间
        
self
.driver.implicitly_wait(
2
)  
# 隐式等待
        
self
.driver.find_element_by_id(
"su"
).click()
        
self
.driver.quit()
if
__name__ 
=
=
'__main__'
:
    
wait
=
TestWait()
    
wait.test_sleep()

【解决方法】:脚本修改

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

from
selenium 
import
webdriver
from
time 
import
sleep
from
selenium.webdriver.support 
import
expected_conditions as EC
from
selenium.webdriver.support.wait 
import
WebDriverWait 
class
TestCase(
object
): 
    
def
setup(
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)  
    
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) 
     
def
test_wait(
self
):
        
wait 
=
WebDriverWait(
self
.driver,
2
)
        
wait.until(EC.title_is(
'百度一下,你就知道'
))
        
self
.driver.find_element_by_id(
'kw'
).send_keys(
'selenium'
)
        
# sleep(2) # 线程阻塞 blocking wait
        
self
.driver.find_element_by_id(
'su'
).click()
        
# sleep(3)
    
def
teardown(
self
):
        
self
.driver.quit() 
if
__name__ 
=
=
'__main__'
:
    
case 
=
TestCase()
    
# case.test_sleep()
    
# case.test_implicitly()
    
case.test_wait()
​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


本文转载自: https://blog.csdn.net/weixin_47648853/article/details/136298990
版权归原作者 小兮说测试 所有, 如有侵权,请联系我们删除。

“python自动化测试selenium核心技术三种等待方式”的评论:

还没有评论