写点什么

selenium 操作元素遇到的异常

作者:红毛丹
  • 2022 年 6 月 12 日
  • 本文字数:2182 字

    阅读完需:约 7 分钟

在脚本编写执行的过程中,会遇到各种各样的异常。这里总结一些常见的报错信息。

1. NoSuchElementException 异常

这是一个经常遇到的异常类型,要查找的元素不存在,那么原因是啥呢,通过实践总结大概有以下几种


(1)定位器编写错误


当遇到这个异常时,首先先检查自己写的定位器是否编写正确


特别是 xpath 和 css 表达式,是否符合语法,这里我们可以使用插件来定位元素自动生成表达式和验证自己写的表达式是否准备,以及当表达式正确的时候,能不能在该页面找到元素,是否有其他触发条件,在其他 iframe 等,也有可能是页面元素发生变化,当你使用元素的文本,属性值,索引等比较易变的方式去定位的时候。


(2)页面或元素加载延迟


执行脚本的时候,有时候该脚本是 pass, 有时候是 fail。这大部分是因为网络带宽不稳定,访问页面数据量大等可能会导致页面加载缓慢。而 selenium 运行速度快,就会出现页面元素找不到的情况。这个时候我们解决此类问题就是在脚本中增加延时,至于这个延时加多少合适,以哪种方式增加,需要根据自己的实际情况来回调试。


(3)联调,所有脚本一起执行的时候


这个有可能,脚本之间的解耦行做的不好,或者当上游失败的时候,tear down 操作里没有复原到原始状态。这种需要阅读代码详细分析,或者 debug 模式执行分析

2. NoSuchFrameException 异常

无论是 frame 或 iframe 切换错误,都会抛出 NoSuchFrameException 异常。最可能的原因如下


(1)定位器错误,跟出现第一种异常一样,也要首先检查自己写的定位器是否准确。


(2)层级错误,例如页面有两个 iframe,当从 1 切换到了 2 的时候,中间没有切换到主页面,而是切换到 2

3. NoSuchWindowException 异常

出现这个异常的原因,大多数是因为要操作的浏览器窗口不是当前窗口。遇到这个异常,我们常常会通过切换窗口的方法,然后再去定位来解决,首先可以获取当前有几个窗口,要操作的元素在第几个窗口,就切换到第几个窗口

4. ElementNotVisiableException 异常

这个异常也很常见,说明当前元素不可见,这个排查方式有两种,


(1)一种是开发那边,这个元素确实没有在页面显示,是个功能 bug,需要开发解决。


(2)另一种是,手工操作的时候,该元素确实显示,而且能够操作,当你跑自动化的时候却报该元素不可见:这有可能是页面加载超时;也有可能是被其他元素遮挡了

5.ElementNotInteractableException 异常

这个异常跟 4 很像,出现这个异常的原因跟 4 差不多,基本上也是页面超时,元素被其他元素遮挡了,或者是当前页面有很多相同的元素,你没有指定索引,它不知道该操作哪个,如果是超时,可以加延时重新运行,被其他元素遮挡一般用 js 操作,页面有很多相同元素,指定具体的索引

6.StaleElementReferenceException 异常

这个异常表示元素过期了,常见大量使用 ajax 或 js 的网站页面,由于 ajax 或 js 可能会持续不断地操作 dom, 所以某些情况下会销毁要操作的元素。当脚本尝试找出已销毁的元素,就会报错。所以在脚本中处理这类异常时,会重新获取该元素,或刷新该页面,举个 RF 例子


VerifyExceptionStaleElement    [Documentation]    处理点击元素报StaleElementReferenceException异常    ...        如果定位元素获取到的是个元素列表,需要传列表index,指定列表中的哪个具体元素    [Arguments]    ${ele_locator}  ${multiple_elements_flag}   ${multiple_elements_locator}  ${ele_index}    IF  '${multiple_elements_flag}' == 'true'        @{ele_list}   get webelements   ${multiple_elements_locator}        click element   ${ele_list}[${ele_index}]    ELSE        refreshpage        sleep  5        click element    ${ele_locator}    END
复制代码

7.InvalidStaleElementException 异常

这个异常的意思是要操作的元素当前处于禁止操作的状态,例如地区选择功能,需要先选择城市,然后才能选择所属地区,而当你没有完成上一个动作,就去直接操作下一个动作的时候,就会抛出该类异常。所以在脚本里要规范该流程

8.TimeoutException 异常

当脚本中的某个命令没有在设置的时间内完成,抛出该异常。例如在显性等待中,如果预期条件无法在设置的时间内完成,就抛出该异常。

9.NoAlertPresentException 异常

产生原因在于,Selenium 期望弹出的提示框没有出现

10.UnsupportedCommandException 异常

当所运行的 WebDriver 实现不支持某个核心 WebDriver API 命令时,将会发现抛出的 UnsupportedCommandException 异常。 有很多第三方 WebDriver 绑定,其完整程度各不相同。并非所有的第三方项目都实现了完整的 WebDriver API。当所使用的驱动程序绑定不支持某个 WebDriver API 命令时,将抛出 UnsupportedCommandException 异常。


如果遇到这种情况,能采取的措施并不多。有以下几种选择。


使用其他命令进行编码来解决问题。


切换到其他 WebDriver 绑定。


自己编写支持该命令所需的代码(同时发起拉取请求)。

11.WebDriverException 异常

WebDriverException 异常,元素此时不可单击, WebDriverException 是一个通常只能在 ChromeDriver 上看到的异常。发生的情况是,当在 Selenium 中尝试单击某个元素时,ChromeDriver 检测到该元素实际上无法获得单击事件,因为其他因素产生了阻碍。造成这种情况的原因可能有以下几种。 有其他元素位于要单击的元素的顶部。 界面还没有完成渲染,在这种半渲染状态中,其他东西暂时覆盖了要单击的元素。 解决方案是显式等待元素变为可单击状态

发布于: 刚刚阅读数: 3
用户头像

红毛丹

关注

还未添加个人签名 2022.01.26 加入

全网网名都是红毛丹 掘金个人主页https://juejin.cn/user/1820446987401374

评论

发布
暂无评论
selenium操作元素遇到的异常_selenium_红毛丹_InfoQ写作社区