python 报错后不关闭窗口_python+selenium 批量执行时出现随机报错问题【已解决】...

本文介绍了在使用Python+Selenium批量执行测试时遇到的窗口切换报错问题。问题源于句柄列表顺序的不确定性,导致无法准确切换到新窗口。作者通过分析错误原因,提出了一个解决方案,即在切换窗口时使用retry()方法,根据窗口数量的不同情况进行处理,避免了随机报错。此外,文章还讨论了如何在测试完成后关闭额外打开的窗口,以确保下一次测试的顺利进行。
摘要由CSDN通过智能技术生成

出现场景:用discover方法批量执行py文件,出现随机性的报错(有时a.py报错,有时b.py报错...),共同特点:均是打开新窗口后,切换最新窗口,但定位不到新窗口的元素,超时报错。由于个人项目遇到的是跑一条用例都有1~3个窗口,所以本文针对1~3个窗口的切换随机报错进行处理。

发现错误原因:

我在切换窗口代码的位置,打印当前句柄信息(print(self.driver.window_handles)),如下图

e3c50631810dcf3ab275816d93bb50c4.png

由于经常习惯性认为,新窗口在句柄列表应该是最后一个,即经常用这句代码来切换到我们认为的最新的窗口。

877f18183a714e871eb5623498d55da9.png

然而实际上句柄列表的顺序是不定的!!!这就导致了我们切换列表最后一个的时候,不一定是最新打开的窗口!!!

3bbded42e4e523e02c3ae564c45d77ef.png

清楚了报错原因,现在想想有什么避错思路~~~

个人解决方法:

首先测试用例这边,retry()为自己写的报错重新切换窗口方法(比较复杂,待优化~主要提供思路)

第一步还是切换到[-1],不管是否成功切到新窗口,进入self.retry()。

f3f21de86fb5750a136aa4ae90bcfaeb.png

第二步,主要是retry(),捕获异常功能,然后先判断有几个窗口,分出两类处理,并分别显示等待查找元素,再对应进行切换窗口。

a. 假设此时有三个窗口(即:self.driver.window_handles>2),则先try查找元素,若报错,则切换到句柄列表的第二个值,然后再进行显示等待查找元素,若再报错,则切换到句柄列表的第一个值,跳出函数方法,直接执行操作语句(因为就三个值,前两个不是,最后一个肯定是了,所以直接操作)。

b.假设此时有两个窗口,则进入else,直接显示等待查找元素,若报错,则切换句柄列表另一个值(总共就两个),然后跳出方法直接操作。

c.假设此时只有一个窗口,则走else,切来切去都是同一个值,直接查找元素后跳出方法进行下一步操作。

168f25aacbda0c87f28b7838f534b113.png

这样就解决了随机报错的问题。(代码待优化,主要看思路哈)

思路画了个图,如下:

08d6922c685b8c6a8b870a6973d9bb00.png

——————————————— 内容分割线  ————————————————

引申:关闭这些弹出的窗口

由于打开浏览器测试后,需要关闭浏览器,再进行下一条用例,如何关闭这些句柄顺序不定的窗口呢?

自己写了比较复杂的代码,待优化~~

263cb7abbb80c4bce56a4d2109c4567a.png

2019.1.17代码已优化!(无论打开多少窗口,清理的时候都只留下初始窗口,其他关闭。)

由于是每个用例执行完后的清理工作,所以加在teardown()里

主要思路还是判断句柄列表中的值是否等于原始窗口,不等于则关闭,清理新打开的窗口,留下原始窗口。

first_window为原始窗口。

5ccbb712a158f1689be3280c6d431214.png

结果: 无随机报错用例。

d89842b0a7b9f1a3c712ff227fd24fb6.png

如有错误或优化代码建议,请一起交流,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值