开发人员在编写代码时总是会考虑到不同的应用场景,但也可能会出现实现效果不如预期的情况。同样的原则也适用于测试代码,编写测试代码的主要目的是测试现有产品的功能、发现错误并使产品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 测试自动化中的异常处理有助于识别特定于浏览器/平台/设备的跨浏览器兼容性问题。
软件测试学习资料获取关注公众号:程序员雷叔