Selenium自动化测试中常见的异常详解

news2024/12/27 1:27:24


概要

开发人员在编写代码时总是会考虑到不同的应用场景,但也可能会出现实现效果不如预期的情况。同样的原则也适用于测试代码,编写测试代码的主要目的是测试现有产品的功能、发现错误并使产品100%无错误。

有句话说得好:"真相总是比小说更离奇",而在执行 Selenium 测试自动化时,你会看到很多 "离奇的事情"。执行测试代码时遇到的这些事情或场景可能不是很常见,但测试实现应该足够强大以处理此类场景。这些场景被恰当地称为异常,在使用 Selenium 进行自动化浏览器测试时,您会遇到许多此类异常。

Selenium 异常广泛用于处理错误场景和避免 Web 应用程序故障。尽管所有Selenium WebDriver代码中都可能发生许多 Selenium 异常,但有些 Selenium 异常是该框架支持的编程语言(如 Java、C#、Python 等)特有的。

本文涵盖了常见的Selenium异常以及特定语言的异常,希望在你遇到代码异常时有所帮助,对执行自动化浏览器测试相关场景时经常使用的Selenium异常情况有一个全面的了解。

一、Selenium 异常简介

异常(也称为故障)是程序执行过程中发生的未出现的事件。当异常发生时,正常的程序执行会停止,并执行相应的异常处理程序。如果没有异常处理程序来处理该特定异常,程序将返回到引发异常的调用函数,最终导致程序终止。

由于 Selenium 测试自动化是在不同的目标平台、设备和Web浏览器上执行的,测试代码的行为可能因浏览器类型或浏览器版本而异。例如,某些属性可能是浏览器特定的,并且如果执行自动浏览器测试的浏览器中不存在特定属性,则抛出异常。通用属性名称也可以是特定于浏览器的,如果目标浏览器上不存在相同的属性,则可能会导致 Selenium 异常,例如 NoSuchAttributeException。

正确处理异常当然很重要,因为未处理的异常可能会导致程序失败,最终影响产品体验。异常对象包含有关异常类型、调用堆栈和其他有用信息的信息,这些信息将有助于调试并使代码更加万无一失。

二、Selenium异常的类别

Selenium 异常分为两大类:已检查异常(Checked exceptions)和未检查异常(Unchecked exceptions)。这些异常根据捕获异常的时间(即编译时或运行时)进行分类。

A. 检查异常

Selenium测试自动化中的检查异常是在测试代码实现过程中处理的,例如 NoSuchAttributeException等,检查异常的处理发生在编译时本身。

程序。如果某些方法会抛出检查异常,最好定义一个处理程序来处理该异常。

B. 未经检查的异常

Selenium 测试自动化中的未检查异常在运行时发生,并且可能比检查异常产生更严重的影响。例如 ElementNotVisibleException、MoveTargetOutOfBoundsException 等。

Java中的异常可以被检查或取消检查,而在C++中,所有异常都是未检查的。在自动化浏览器测试相关场景中,通常会遇到未经检查的异常,因为测试跨越不同的Web浏览器和操作系统组合和版本。

三、常见的Selenium 异常

在本地或远程 Selenium 网格上执行自动化浏览器测试时,你会遇到不同类型的异常。一些 Selenium 异常特定于用于编写Selenium测试自动化场景的编程语言。

以下是所有Selenium WebDriver代码中可能发生的一些常见Selenium异常:

1. ElementClickInterceptedException(元素点击拦截异常)

由于接收Click命令的元素以某种方式隐藏,因此无法正确执行Element Click命令。

2. ElementNotInteractableException(元素不可交互异常)


即使目标 Web 元素存在于 DOM 上,但与该元素的交互将命中另一个 Web 元素时,也会引发“ElementNotInteractableException”Selenium 异常。

3. ElementNotSelectableException(元素不可选异常)


当目标元素存在于 DOM 上但由于该元素不可选择而无法与之交互时,会发生此 Selenium 异常。例如,与 script 元素交互时会抛出此异常。

4. ElementNotVisibleException(元素不可见异常)


最常见的 Selenium 异常类型,即使 Web 元素存在但不可见时也会抛出该异常。由于该元素不可见,因此不可能与该元素进行任何交互。

这种情况在 Selenium 测试自动化中经常遇到,其中尝试对 Web 元素(例如按钮、标签等)进行相关操作(单击、读取等),但该元素在视图中隐藏。另一个示例是 HTML 中定义的隐藏类型的元素。

5. ErrorInResponseException


当服务器端发生某些问题或错误时,会抛出此 Selenium 异常。当使用错误的用户名和访问密钥组合来访问基于云的远程 Selenium Grid、与远程 Web 驱动程序服务器通信或与 Firefox 扩展(或 Chrome 插件)通信时,可能会发生这种情况。


服务器端错误的一些常见响应代码如下:

401 — Unauthorized(未授权)
400 — BadRequest(错误请求)
500 — InternalServerError(内部服务器错误)
409 — Conflict(冲突)
403 — Forbidden(禁止)
405 — MethodNotAllowed(方法不允许)

6. ImeActivationFailedException(输入法引擎激活失败异常)


如果IME(输入法引擎)由于某种原因激活失败,则抛出此异常。
处理此问题的理想方法是检查计算机上是否有 IME 支持。

7. ImeNotAvailableException(输入法不可用异常)


如果 IME(输入法引擎)不可用,则抛出此 Selenium 异常。如果测试机器上不提供 IME 支持,则每个 IME 相关方法都会引发 ImeNotAvailableException。

8. InsecureCertificateException(不安全证书异常)


使用过期或无效的 TLS 证书导致用户代理发出证书警告。

9. NoSuchFrameException


当要切换到的框架不存在时,就会抛出 NoSuchFrameException Selenium 异常。

为避免此类 Selenium 异常,建议在自动浏览器测试代码中添加有关切换到框架模式的正确性检查。检查使用的框架索引是否正确。可添加几毫秒(ms)的额外等待,以确保框架加载完成。

10. NoSuchWindowException


当切换到的窗口目标不存在时抛出此异常。这些情况可以通过使用 window_handles 来处理,以获得当前的活动窗口集。窗口句柄可用于在其上执行适当的操作。

11. RemoteDriverServerException(远程驱动服务器异常)
 

当浏览器功能中的错误组合/字段导致服务器不发送响应时,抛出此异常。为了避免此类 Selenium 异常,从(平台 + 浏览器)、(平台 + 浏览器 + 浏览器版本)等有效组合的角度彻底检查 Selenium 浏览器功能非常重要。

12. ScreenshotException(截屏异常)


顾名思义,当无法捕获屏幕时会抛出此 Selenium 异常。这种情况很可能出现在用户输入敏感信息(例如用户名、密码、银行信息等)的网页/Web 应用程序中。在这种情况下,由于屏幕截图限制而无法捕获屏幕。在这里,屏幕截图限制会阻止屏幕被捕获或记录。

13. SessionNotCreatedException


当新会话创建不成功时会出现此异常。

14. InvalidArgumentException(无效参数异常)


当传递的参数无效或格式错误时,将引发 InvalidArgumentException 异常。

更好的做法是在 Selenium 测试自动化代码中使用适当的等待(以毫秒为单位)来验证被测网页是否已加载。

15. InvalidCookieDomainException


当尝试为与当前 URL 不同的 URL/域添加 cookie 时,会引发此 Selenium 异常。


要处理此异常,应该导航到必须添加 cookie 的正确 URL。

16. InvalidCooperativesException(无效坐标异常)


当向交互操作提供不正确的坐标时,会引发此特定异常。这也意味着依赖于鼠标位置的操作(例如单击)之前没有移动操作,或者为移动操作提供了无效的坐标。

17. InvalidElementStateException(无效元素状态异常)


当由于元素未处于有效状态或元素未启用执行该操作而无法完成命令时,将引发此 Selenium 异常。如果在不可编辑且不可重置的 Web 元素上尝试执行诸如清除元素之类的操作,则可能会导致这种情况。

要在 Selenium 测试自动化中处理此类异常,建议先等待该元素启用,然后再对其执行所需的操作。

18. InvalidSelectorException(无效选择器异常)

如果在不同版本之间更改了选择器名称,就可能意外使用无效或不正确的选择器来定位 Web 元素。如果用于查找 Web 元素的选择器没有返回 WebElement,就会产生 InvalidSelectorException 异常。

这种情况通常发生在选择器是 XPath 表达式且 XPath 无效的情况下。这将导致无法找到目标网页元素。

19. InvalidSessionIdException(无效会话标识异常)


如果 Selenium 测试自动化实现中使用的会话 ID 无效,即不在当前活动会话列表中,则会抛出此异常。如果会话不活动或从未存在过,就会发生这种情况。

20. InvalidSwitchToTargetException(无效目标切换异常)


如果切换到的框架或窗口目标无效,则会出现此 Selenium 异常。在切换到该框架之前,使用“检查工具”验证目标框架的 XPath 非常重要。

21. JavascriptException


当执行 JavaScript 代码出现问题时抛出此异常。

22. NoAlertPresentException(无警报显示异常)


当切换到屏幕上尚未出现的警报时会发生该异常。处理警报的理想方法是检查警报是否存在,然后调用 Alert() 类上所需的操作。

23. MoveTargetOutOfBoundsException(移动目标超出边界异常)


如果提供给 ActionChains() 移动方法的目标超出范围,即无效或在文档/网页之外,就会出现 Selenium 异常。

在调用 ActionChains() 类的 move 方法之前,应始终检查我们试图移动的位置,只有当该位置出现在屏幕上时才执行相同的操作。

24. NoSuchAttributeException(无属性异常)


这是在进行自动化浏览器测试时一定会遇到的少数 Selenium 异常之一。如果无法找到元素的属性,就会抛出 NoSuchAttributeException 异常。

要处理此异常,应针对执行测试的浏览器检查属性是否存在。不同浏览器中同一属性的不同属性名可能各不相同,如果处理效率低下,就会导致此异常。

避免发生此异常的另一种方法是根据 DOM 上元素的新细节更改属性。

25. NoSuchCookieException(无Cookie异常)


当当前浏览上下文活动文档的关联 Cookie 中不存在与给定路径名匹配的 Cookie 时,就会出现 Selenium 异常。

26. NoSuchElementException(无元素异常)


当用于访问元素的定位器无效,或试图对一个不在 DOM 中的元素执行操作时,Selenium 会抛出 NoSuchElementException 异常。在这两种情况下,都找不到元素。

要处理 Selenium 异常,应检查选择器是否正确,如果正确,则需要额外等待以确保 WebElement 的出现。

27. StaleElementReferenceException(陈旧元素引用异常)

当引用的元素已不在页面的 DOM 中时,会出现 Selenium 异常。简单地说,该元素已经衰减或过时。

导致这种特殊 Selenium 异常的一些可能原因有:

  • 元素可能在一个被刷新的 iFrame 中。

  • 页面可能已经刷新,要访问的元素不再是当前页面的一部分。

  • 该元素可能已被移除并重新添加到屏幕上,因为该元素已被定位。

处理此异常的一个可行解决方案是使用动态 XPath 在循环中查找所需元素,并在找到元素后中断循环。

28. TimeoutException(超时异常)


若当前正在执行的命令没有在预期时间内完成时,就会出现超时异常。

处理这种异常的一个可行办法是增加命令完成执行的等待时间。不过,应该为等待时间选择一个理想值,否则可能会延迟进一步执行。

29. UnableToSetCookieException(无法设置Cookie异常)


当Selenium WebDriver 无法设置 cookie 时会出现这种 Selenium 异常。

可以添加额外的等待时间,以便为域加载 cookie。

30. UnexpectedAlertPresentException( 意外警报出现异常)


当出现意外警报时发生。发生此异常的一个常见原因是页面上出现模式窗口/弹出窗口导致 Selenium WebDriver 命令被阻止。

31. UnexpectedTagNameException(标签名称异常)


当支持类无法找到预期的 Web 元素时,会发生此 Selenium 异常。

32. UnknownMethodException( 未知方法异常)


这是常见的 Selenium 异常之一,当请求的命令能够匹配已知 URL 但无法匹配该 URL 的方法时就会发生。要处理此异常,应检查与 URL 一起传递的方法是否有效。

33. WebDriverException


这是由于 Selenium WebDriver 和目标 Web 浏览器的绑定不兼容而发生的基本 WebDriver 异常。要处理此异常,应该下载与相应 Web 浏览器兼容的 Selenium WebDriver 库。

四、Java中的Selenium异常

有些Selenium异常是特定编程语言的测试自动化所特有的。除了上面介绍的 Selenium 中的常见异常外,下面介绍 Java 语言特有的 Selenium 异常:

34. ConnectionClosedException(连接关闭异常)


当与 Selenium WebDriver 的连接丢失时抛出此异常。

35. ErrorHandler.UnknownServerException


当服务器返回错误而没有堆栈跟踪时,它用作占位符。

36. JsonException


当你能获取会话功能,但却没有创建会话时会抛出此异常。

37. NoSuchSessionException


在 WebDriver.quit() 执行后调用命令时会抛出此 Selenium 异常。由于 WebDriver 实例已不存在,对该特定 WebDriver 实例的任何操作都会返回此异常。

38. NotFoundException


当DOM上不存在元素时会发生此异常。

39. ScriptTimeoutException


当异步脚本的执行没有在给定的时间限制内完成时抛出。

40. UnhandledAlertException(未处理警报异常)

Selenium 异常是 WebDriver 异常的子类。当 WebDriver 无法执行警报操作(即使存在警报)时,就会抛出该异常。

41. UnreachableBrowserException(无法访问浏览器异常)


UnreachableBrowserException 表示与自动化测试代码控制的 Web 浏览器通信时出现问题。这也可能是由于与 Selenium 服务器通信的问题造成的。

如果远程 Selenium WebDriver 或 Selenium 网格的服务器地址无效,则可能会发生这种情况。浏览器实例也有可能在 Selenium 测试自动化周期中终止。

42. UnsupportedCommandException(不支持的异常命令)

当远程 Selenium WebDriver 发送的命令无效时抛出此异常。

43. NoSuchContextException


该异常发生在移动测试中,由 ContextAware.context(String) 抛出。

44. NotConnectedException


当在规定的时间段内尝试连接后尝试连接特定主机或远程 Selenium 网格失败时,将引发此 Selenium 异常。

45. SeleniumException


顾名思义,当 Selenium 命令失败时会抛出 Selenium 异常。

46. UnableToCreateProfileException(无法创建配置文件异常)


当要执行 Selenium 测试自动化的浏览器使用某些自定义配置文件打开但 WebDriver 或浏览器在支持该配置文件时出现问题时,会发生 UnableToCreateProfileException。

要处理此异常,建议检查已安装的 Selenium WebDriver 版本以及 Web 浏览器支持的配置文件。

47. UrlChecker.TimeoutException


当浏览器在尝试一段时间后无法打开被测 URL 时,会抛出此异常。

要处理此 Selenium 异常,在尝试在浏览器中打开(正在测试中)之前,必须检查 URL 的正确性。

五、C#中的Selenium异常

C# 特有的Selenium异常有:

48. DriverServiceNotFoundException(驱动程序服务未找到异常)

当执行自动浏览器测试的元素不可见时,将引发 DriverServiceNotFoundException 类下的异常。

要处理此异常,可以等待页面完全加载,在确认 Web 元素可见后再执行 Selenium WebDriver 命令。

49. WebDriverTimeoutException


WebDriverTimeoutException 类表示执行操作时发生错误时引发的异常。

50. XPathLookupException


当XPath查找过程中发生错误时抛出的Selenium异常。

六、处理Selenium异常

处理 Selenium 异常的方式因编程语言而异。不过,最重要的一点是,Selenium异常应该被处理,因为异常提供了极其重要的信息。

以下是常用编程语言处理 Selenium 异常的简要要点:

Python:如果你使用Python进行浏览器自动测试,异常类可在selenium.common.exception中找到,在使用该包的任何命令之前都应导入。

异常使用 try...except 块来处理,其中 try 块可让你测试代码是否出错,except 块可帮助你处理错误,而可选的 finally 块无论 try 块是否引发错误都会被执行。

Java :Selenium 异常在 Java 中使用 try-catch 方法处理。try 代码块是代码块的开始,catch 代码块包含解决异常的执行。catch 块位于 try 块的末尾。

与 Python 一样,您也可以使用 finally 关键字创建一个代码块,无论异常是否发生,该代码块都会被执行。

C# :与 Java 类似,Selenium 也使用 try-catch 语句处理异常。try 块包含可能导致异常的代码。try 块下的代码会被执行,直到代码成功执行或异常抛出。catch 块包含不同异常的处理程序。

总而言之

异常在开发中很常见,但必须小心处理。了解不同的 Selenium 异常非常重要,因为这有助于开发更强大的自动化浏览器测试脚本。

Selenium 测试自动化中的异常处理有助于识别特定于浏览器/平台/设备的跨浏览器兼容性问题。

你使用过哪些处理 Selenium 异常的机制,请在评论部分留下你的经验......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot使用@Value获取不到yaml中配置的值

在最近的开发中遇到一个问题,使用Value获取yml文件中配置的属性时始终获取不到值,一开始我以为是没有注入的问题,或者没有写setter方法的问题,后来我发现这些都都写了然后开始百度发现获取不到属性值有这么几个原因 获取不到值的原因 1.没有使用Component注解,也就是没有注入…

J2EE的N层体系结构

J2EE平台采用了多层分布式应用程序模型,实现不同逻辑功能的应用程序被封装到不同的构件中,处于不同层次的构件可被分别部署到不同的机器中。 RMI/IIOP:RMI(Remote Method Invocation,远程方法调用)是Java的…

Qt Signals Slots VS QEvents - Qt跨线程异步操作性能测试与选取建议

相关代码参考:https://gitcode.net/coloreaglestdio/qtcpp_demo/-/tree/master/qt_event_signal 1.问题的由来 在对 taskBus 进行低延迟改造时,避免滥用信号与槽起到了较好的作用。笔者在前一篇文章中,叙述了通过避免广播式地播发信号&…

HarmonyOS鸿蒙原生应用开发设计- HarmonyOS Sans 字体

HarmonyOS设计文档中,为大家提供了独特的字体,开发者可以根据需要直接引用。 开发者直接使用官方提供的字体内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可以防止使用别人的字体侵权意外情况等,减少自主创…

大模型:机器学习的崭新时代

原创 | 文 BFT机器人 在机器学习领域,随着计算能力和数据规模的不断增长,大模型成为一种引人注目的技术。这些具有大规模参数和参数量的机器学习模型正在改变着我们对于人工智能的认识,大模型的出现使得机器学习模型能够处理更复杂的任务&am…

看完这篇 教你玩转渗透测试靶机Vulnhub——Mr-Robot :1

Vulnhub靶机Mr-Robot :1渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:暴力破解:③:登入后台GetShell&#xff1a…

docker入门加实战—项目部署之DockerCompose

docker入门加实战—项目部署之DockerCompose 我们部署一个简单的java项目,可能就包含3个容器: MySQLNginxJava项目 而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果手动的逐一部署&#xff0c…

RTSP/Onvif安防平台EasyNVR接入EasyNVS,出现报错“Login error, i/o deadline reached”的解决方法

EasyNVS管理平台具备汇聚与管理EasyGBS、EasyNVR等平台的能力,可以将接入的视频资源实现视频能力统一输出,并能进行远程可视化运维等管理功能,还能解决设备现场没有固定公网IP却需要在公网直播的需求。 有用户反馈,RTSP/Onvif协议…

C语言用筛选法求 100 之内的素数(挖去 1,被除数平方根)

完整代码: // 用筛选法求 100 之内的素数(挖去 1,被除数平方根) //筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来…

三刷操作系统之一文带你搞懂FreeRTOS——互斥信号量和递归互斥信号量

1.互斥信号量 互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用中(任务与任务或中断与任务之间的同步)二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一个钥匙,当任务想要使用资源的时候就必须先获得这个钥匙…

apple MFI工厂认证,干货,为防止MFI工作人员查看,已设置VIP阅读

一开始以为审核特别严格,准备了好久,经历过了之后会发现很简单,1个小时完成了所有审核事项。 好好招待审计员,比如能接送就接送,到点吃饭就尽量约时间吃饭后再审计,找个正式的会议室,该摆盘水果就摆上,让审计员感觉到公司是很重视这次的MFI审核,但是不能贿赂发红包那…

第一章 | 计算机网络原理 谢希仁(第八版)_ 习题答案

文章目录 计算机网络原理 谢希仁(第八版)第一章习题答案1-011-021-031-041-051-061-071-081-091-101-111-121-131-141-151-161-171-181-191-201-211-221-231-241-251-261-271-281-291-301-311-321-331-341-351-36 计算机网络原理 谢希仁(第八…

Arm 警告其 GPU 驱动漏洞正被活跃利用

导读Arm 周一警告其 Mali 系列 GPU 驱动漏洞 CVE-2023-4211 正被活跃利用。 Mali GPU 被广泛用于 Google Pixels 等 Android 手机,Chromebook 等 Linux 设备。 本地非特权用户可利用该漏洞访问已释放的内存。访问不再使用的系统内存是将恶意代码加载到攻击者可执行…

MFC+OSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码

MFCOSG(Open Secene Graph)场景实现中文HUD(head up display)效果,防止中文乱码 背景:为什么同时使用MFC和OSG 我建立了一个MFC工程,以OSG作为视图显示的基础,通过点击MFC菜单启动某些功能。因此&#xf…

基于springboot实现地方废物回收机构平台管理系统【项目源码+论文说明】

基于springboot实现地方废物回收机构管理系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把地方废物回收机构管理与现在网络相结合,利用java技术建设地方废物回收机构管理系统,实现地方废物回收机构的信息化。则对于进一步提高地方废物回收机…

【Javascript】运算符(赋值,算术,自增,自减)

目录 赋值 算术 单个变量: 多个变量: 在字符串,数组中充当连接符 自符串与字符串 数组与数组 数组与字符串 自增与自减 前置 自增 自减 后置 自增 自减 赋值 var a 1;算术 单个变量: var a 1;a 1;console.l…

最小二乘法,可视化UI界面

import tkinter as tk import numpy as np import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from pylab import mplmpl.rcParams[font.sans-serif] [FangSong] # 指定默认字体 mpl.rcParams[axes.unicode_minus] False …

【matplotlib】matplotlib的颜色表

【matplotlib】matplotlib的颜色表 文章目录 【matplotlib】matplotlib的颜色表1. 颜色表Reference 1. 颜色表 在使用matplotlib库进行绘图的时候,只需要指定关键字coloryour_color就能修改绘制的颜色了,具体的颜色表如下。 Reference https://finthon…

文献阅读(207)FPGA HBM

题目:HBM Connect: High-Performance HLS Interconnect for FPGA HBM时间:2021会议:FPGA研究机构:UCLA Jason Cong 题目:Demystifying the Memory System of Modern Datacenter FPGAs for Software Programmers throug…

五金经营小程序商城的作用体现在哪

对消费者而言,如今线上购买五金是很多人的选择,传统线下购买,不仅需要跑路,而且店内未必有所需品,但线上平台则一目了然购买所需品,本地/外地均可以触达到,同时还可对用户/会员进行高效管理&…