selenium操作元素遇到的异常

发表于:2022-6-01 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:红毛丹    来源:稀土掘金

  在脚本编写执行的过程中,会遇到各种各样的异常。这里总结一些常见的报错信息。
  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 检测到该元素实际上无法获得单击事件,因为其他因素产生了阻碍。造成这种情况的原因可能有以下几种。 有其他元素位于要单击的元素的顶部。 界面还没有完成渲染,在这种半渲染状态中,其他东西暂时覆盖了要单击的元素。 解决方案是显式等待元素变为可单击状态。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号