zoukankan      html  css  js  c++  java
  • 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为原始窗口。

     

    结果: 无随机报错用例。

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

  • 相关阅读:
    ASP.NET MVC 中将FormCollection与实体间转换方法
    MVC Actionlink 参数说明
    mvc中Scripts.Render、Styles.Render
    MVC项目内无法添加System.Web.Optimization
    NUGET命令
    Entity Framwork(EF) 7——在Controller内获取指定字段的值
    学习Django
    windows下上传文件到VWware的centos
    Python、PIP环境变量的配置
    对已经发布订阅的sqlserver进行修改-添加新的表
  • 原文地址:https://www.cnblogs.com/4wheel/p/10195053.html
Copyright © 2011-2022 走看看