出现场景:用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 批量执行时出现随机报错问题【已解决】的更多相关文章

  1. Python selenium PO By.XPATH定位元素报错

    Python selenium PO  By.XPATH定位元素报错 如下代码经常报错: # 首页的“新建投放计划”按钮 new_ads_plan = (By.XPATH, "//*[tex ...

  2. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)

    原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...

  3. 使用自编译的Emacs26.0.50build10版本,helm报错(已解决)

    使用自编译的Emacs26.0.50build10版本,helm报错(已解决) */--> code {color: #FF0000} pre.src {background-color: #0 ...

  4. shell执行${var:m:n}报错Bad substitution解决办法

    Ubuntu系统下,执行字符串截取脚本时,总是报错:Bad substitution,脚本非常简单如下: #!/bin/sh str1="hello world!" :} 执行后报 ...

  5. py+selenium 直接给日期赋值,控制台调试报错【已解决】

    目标:给带日期控件的输入框赋值. 百度去搜索让你各种去只读readonly属性,再send_keys 方法: 其实既然可以去除readonly属性,那就可以直接给属性赋值,将两行代码缩为一行. dri ...

  6. 防火墙centos7执行 service iptables status报错问题完美解决

    在centos7 执行防火墙命令时 service iptables status 报错如下: 解决方案 : 1.systemctl start firewalld.service(开启防火墙) 2. ...

  7. React Native 填坑之神奇的报错,已解决

    下面对报错进行一下详细描述: 在debug时,点着点着,就会发生: 1.手机显示如下 : Attempted to transition from state `RESPONDER_INACTIVE_ ...

  8. 机器装多个版本php,并安装redis插件报错【已解决】

    机器原版本php5.5.3 适应新的框架安装了7.1.12 期间遇到的小问题就是安装 redis插件的时候,总报错,报错如下: Starting php-fpm [02-Jan-2019 10:15: ...

  9. Eclipse中删除导入的jar包,总是报错?已解决!

    参考百度经验 http://jingyan.baidu.com/article/851fbc37c7512e3e1f15abec.html

随机推荐

  1. QDialog之屏蔽Esc键(简单深刻,要么重写keyPressEvent然后break忽略此事件,要么重写eventFilter然后return,都是为了忽略此事件)

    简述 Qt中Esc键会在一些控件中默认的进行一些事件的触发,比如:QDialog,按下Esc键窗口消失.大多数情况下,我们不需要这么做,那么就需要对默认事件进行屏蔽. 简述 源码分析 事件过滤器 事件 ...

  2. 解决手机提示TF卡受损需要格式化问题

    昨晚因为上QQ FOR PAD后.关机.结果又杯具了.上次无意看到一个SD卡修复命令,收藏起来了.一试,还真管用.现把它写出来.分享给大家.以后出现SD卡受损,千万不要再格式化内存卡了.修复过程:1. ...

  3. 2015元旦第一弹——WP8.1应用程序栏(C#后台代码编写)

    //第一次写博文,以后还请各位道友互相关照哈.废话不多说,直接进入正题. 相信大家对于如何在XAML添加应用程序栏应该很清楚,不清楚的话,可以打开新建个Pviot应用 就有系统自带的菜单栏. 本文主要 ...

  4. QML Settings 小的示例

    QML 中使用 Settings 可以保存一些简单的信息,例如用户名,密码,窗口位置,大小等,没有Sqlite那么麻烦,简单易用哦~~~(环境:Qt5.8  for android ,Windows ...

  5. TWebBrowser控件与MSHTML库连接

    WebBrowser控件配置与IE的配置相同 方法一 使用Document属性得到 Document 层WebBrowser.Document:IDispatch //是IDispatch接口 Var ...

  6. Vista之前的版本,默认本地登陆用户都以管理员权限启动程序

    Vista之前的版本,默认本地登陆用户都以管理员权限启动程序,之后的OS版本默认都没有管理员权限,需要用户提权才能做某些操作,否则需要管理员权限的操作都会失败MSSQL是用户名账号连接,Socket方 ...

  7. Django ORM基础篇【转载】

    ORM( Object relational mapping 对象关系映射)D:把面向对象中的类和数据库表一一对应起来,在django项目与数据库之间起着桥梁的                     ...

  8. java源码解析之String类(一)

    String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开Strin ...

  9. Adboe Flash远程代码执行_CVE-2018-4878漏洞复现

    Adboe Flash远程代码执行_CVE-2018-4878漏洞复现 一.漏洞描述 该漏洞可针对windows用户发起定向攻击.攻击者可以诱导用户打开包含恶意Flash代码文件的Microsoft ...

  10. Django生成PDF显示在网页上以及解决中文显示乱码的问题

    项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master 这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来 ...