python+selenium 批量执行时出现随机报错问题【已解决】
出现场景:用discover方法批量执行py文件,出现随机性的报错(有时a.py报错,有时b.py报错...),共同特点:均是打开新窗口后,切换最新窗口,但定位不到新窗口的元素,超时报错。由于个人项目遇到的是跑一条用例都有1~3个窗口,所以本文针对1~3个窗口的切换随机报错进行处理。
发现错误原因:
我在切换窗口代码的位置,打印当前句柄信息(print(self.driver.window_handles)),如下图

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

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

清楚了报错原因,现在想想有什么避错思路~~~
个人解决方法:
首先测试用例这边,retry()为自己写的报错重新切换窗口方法(比较复杂,待优化~主要提供思路)
第一步还是切换到[-1],不管是否成功切到新窗口,进入self.retry()。

第二步,主要是retry(),捕获异常功能,然后先判断有几个窗口,分出两类处理,并分别显示等待查找元素,再对应进行切换窗口。
a. 假设此时有三个窗口(即:self.driver.window_handles>2),则先try查找元素,若报错,则切换到句柄列表的第二个值,然后再进行显示等待查找元素,若再报错,则切换到句柄列表的第一个值,跳出函数方法,直接执行操作语句(因为就三个值,前两个不是,最后一个肯定是了,所以直接操作)。
b.假设此时有两个窗口,则进入else,直接显示等待查找元素,若报错,则切换句柄列表另一个值(总共就两个),然后跳出方法直接操作。
c.假设此时只有一个窗口,则走else,切来切去都是同一个值,直接查找元素后跳出方法进行下一步操作。

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

——————————————— 内容分割线 ————————————————
引申:关闭这些弹出的窗口
由于打开浏览器测试后,需要关闭浏览器,再进行下一条用例,如何关闭这些句柄顺序不定的窗口呢?
自己写了比较复杂的代码,待优化~~

2019.1.17代码已优化!(无论打开多少窗口,清理的时候都只留下初始窗口,其他关闭。)
由于是每个用例执行完后的清理工作,所以加在teardown()里
主要思路还是判断句柄列表中的值是否等于原始窗口,不等于则关闭,清理新打开的窗口,留下原始窗口。
first_window为原始窗口。

结果: 无随机报错用例。

如有错误或优化代码建议,请一起交流,谢谢!
python+selenium 批量执行时出现随机报错问题【已解决】的更多相关文章
- Python selenium PO By.XPATH定位元素报错
Python selenium PO By.XPATH定位元素报错 如下代码经常报错: # 首页的“新建投放计划”按钮 new_ads_plan = (By.XPATH, "//*[tex ...
- asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)
原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...
- 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)
使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...
- shell执行${var:m:n}报错Bad substitution解决办法
Ubuntu系统下,执行字符串截取脚本时,总是报错:Bad substitution,脚本非常简单如下: #!/bin/sh str1="hello world!" :} 执行后报 ...
- py+selenium 直接给日期赋值,控制台调试报错【已解决】
目标:给带日期控件的输入框赋值. 百度去搜索让你各种去只读readonly属性,再send_keys 方法: 其实既然可以去除readonly属性,那就可以直接给属性赋值,将两行代码缩为一行. dri ...
- 防火墙centos7执行 service iptables status报错问题完美解决
在centos7 执行防火墙命令时 service iptables status 报错如下: 解决方案 : 1.systemctl start firewalld.service(开启防火墙) 2. ...
- React Native 填坑之神奇的报错,已解决
下面对报错进行一下详细描述: 在debug时,点着点着,就会发生: 1.手机显示如下 : Attempted to transition from state `RESPONDER_INACTIVE_ ...
- 机器装多个版本php,并安装redis插件报错【已解决】
机器原版本php5.5.3 适应新的框架安装了7.1.12 期间遇到的小问题就是安装 redis插件的时候,总报错,报错如下: Starting php-fpm [02-Jan-2019 10:15: ...
- Eclipse中删除导入的jar包,总是报错?已解决!
参考百度经验 http://jingyan.baidu.com/article/851fbc37c7512e3e1f15abec.html
随机推荐
- 一个技术人,最重要的是:极客精神(好奇心 + 探索欲)(新de代码)
一个技术人,最重要的是:极客精神(好奇心 + 探索欲) 初到社会,面对众多的IT企业,我们是陌生与好奇的,认为所有企业都是管理一流并且高大上等的.然而工作多年以后你会发现,国内的IT企业环境良莠不齐, ...
- 汉的Unicode编码是6C49,而且通常都是小端存储。汉字的unicode范围是:0x4E00~0x9FA5,即CJK一共20928个字符。GBK有21886个汉字,所以多了958个汉字
小端存储的结果是 49 6C UTF-8有点类似于Haffman编码,它将Unicode编码为:0x00-0x7F的字符,用单个字节来表示:0x80-0x7FF的字符用两个字节表示:0x800-0xF ...
- 为DataGridTemplateColumn设置快捷菜单
<DataGrid.ContextMenu> <ContextMenu> <MenuItem Command="{x:Static ApplicationCom ...
- DLL里面socket(Delphi的代码)
http://hi.baidu.com/game_base/item/f617e4136414148889a956ed 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发 ...
- 分布式自增ID算法snowflake (Java版)
概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种 ...
- javaweb各种框架组合案例(三):maven+spring+springMVC+hibernate
1.hibernate译为"越冬",指的是给java程序员带来春天,因为java程序员无需再关心各种sql了: 2.hibernate通过java类生成数据库表,通过操作对象来映射 ...
- 【转】 远程连接mysql
转自:http://www.linuxidc.com/Linux/2013-05/84813.htm 1.确认能ping通 2.确认端口能telnet通.如果user表的host值是localhost ...
- Loadrunner做性能测试的主要步骤
Loadrunner做性能测试的主要步骤: Loadrunner将性能测试过程分为计划测试.测试设计.创建VU脚本.创建测试场景.运行测试场景和分析结果6个步骤. 1) 计划测试:主要进行测试需求的收 ...
- Redis 在java中的使用(登录验证,5分钟内连续输错3次密码,锁住帐号,半小时后解封)(三)
在java中使用redis,做简单的登录帐号的验证,使用string类型,使用redis的过期时间功能 1.首先进行redis的jar包的引用,因为用的是springBoot,springBoot集成 ...
- yii DAO操作总结
数据库代码: /* Navicat MySQL Data Transfer Source Server : lonxom Source Server Version : 50524 S ...