Selenium异常集锦

当测试工程师执行Selenium测试自动化用例时,可能会遇到很多陌生的Exception。在执行测试脚本时,有些*Exception*可能不是很常见,因为测试用例锁依赖的测试框架拥有足够健壮性以应对此类场景。 这些未被预期的场景被称为*异常场景*,在使用Selenium进行自动浏览器测试时,通常来讲会遇到很多*异常场景*。

Selenium异常广泛用于处理错误情况并避免*Web应用程序*故障。尽管在所有Selenium WebDriver代码中都可能发生许多Selenium异常,但是某些Selenium异常基于特定于框架支持的编程语言,例如JavaC#Python等。本文将介绍了常见的Selenium通用的异常以及特定于语言的异常。这是一个详尽的列表,当你在代码中遇到异常时可能会有所帮助。

Selenium异常简介

异常(Exception)是在程序执行过程中发生的未预期的事件。发生异常时,正常程序的执行将停止,并执行相应的异常处理逻辑。如果没有异常处理程序来处理该特定异常,程序将返回引发异常的调用函数,最终导致程序或者线程终止。

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

正确捕获/处理异常是一个好习惯,因为未处理的异常会导致程序失败而终止,从而最终影响终端用户体验。异常对象包含有关异常类型调用堆栈异常信息等内容,这些信息将有助于调试并使代码更可靠。

Selenium异常分类

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

Checked Exceptions

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

如果某些方法引发了检查的异常,则最好定义一个处理该特定异常的处理逻辑代码。

Unchecked Exceptions

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

与浏览器自动测试相关的场景中,经常会遇到未经检查的异常,因为这些测试涉及浏览器和操作系统的不同组合和版本,包括网络和异步加载等因素都会导致未检查异常的发生。

Selenium异常备忘单

在本地浏览器或远程Selenium平台上执行自动浏览器测试时,测试人员会遇到很多类型的异常。一些Selenium异常特定于用于编写Selenium测试自动化方案的编程语言。

常见的Selenium异常

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

ElementClickInterceptedException

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

ElementNotInteractableException

即使目标Web元素存在于DOM上,但与该元素的交互将击中另一个Web元素时,也会抛出此ElementNotInteractableExceptionSelenium异常。

ElementNotSelectableException

当目标元素存在于DOM上但由于无法选择而无法与之交互时,就会发生此Selenium异常。

ElementNotVisibleException

Selenium异常的最常见类型,即使存在web元素但不可见,将引发该异常。由于该元素不可见,因此无法与该元素进行任何交互。

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

ErrorInResponseException

当服务器端发生某些问题或错误时,将抛出这个Selenium异常。如果错误的用户名和访问密钥的组合用于访问基于云的远程Selenium Grid,在与远程Web驱动程序服务器进行通信或与Firefox扩展(或Chrome拓展)进行通信,则可能会发生这种情况。

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

  • 401:未经授权
  • 400:错误的请求
  • 500:内部服务器错误
  • 409:冲突
  • 403:禁止
  • 405:方法被禁止

ImeActivationFailedException

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

ImeNotAvailableException

如果IME(输入法)不可用,则抛出此Selenium异常。如果在测试计算机上没有IME支持,则会为每个与IME相关的方法抛出ImeNotAvailableException

InsecureCertificateException

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

NoSuchFrameException

当要切换到的iframe不存在时,将引发NoSuchFrameException这个Selenium异常。

为避免此类Selenium异常,建议在基于浏览器的自动化测试代码中添加有关切换到iframe的方式时进行健全性检查。检查使用的iframe索引是否正确。可以添加几百毫秒(ms)的额外等待时间,以确保完成iframe加载。

NoSuchWindowException

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

RemoteDriverServerException

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

ScreenshotException

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

SessionNotCreatedException

当新会话的创建不成功时,将发生此异常。

InvalidArgumentException

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

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

InvalidCookieDomainException

当尝试添加cookieURL/host与当前URL不同时,将抛出此Selenium异常。

要处理此异常,测试人员编写代码时应该导航到必须在其中添加Cookie的正确URL地址。

InvalidCoordinatesException

将错误的坐标提供给交互操作时,将引发此特定异常。

这也意味着依赖于鼠标位置(例如单击)的动作之前没有进行移动操作,或者为移动操作提供了无效的坐标。

InvalidElementStateException

当命令无法完成时会抛出此Selenium异常,因为该元素处于无效状态或未启用该元素来执行该操作。如果在不可编辑且不可重置的Web元素上尝试执行诸如清除元素之类的操作,可能会导致这种异常的出现。

要在Selenium测试自动化中处理此类异常,建议在对该元素执行所需的操作之前等待该元素被启用或者在操作之前进行检查。

InvalidSelectorException

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

XPath表达式是选择器并且XPath无效时,通常会发生这种情况。这将导致无法找到所需的Web元素。

InvalidSessionIdException

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

InvalidSwitchToTargetException

如果要切换到的iframewindow你目标无效,则会出现此Selenium异常。在切换到该iframe之前,请使用检查工具验证目标框架的XPath,可以避免次异常的发生。

JavascriptException

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

NoAlertPresentException

当切换到屏幕上尚不存在的alert时,会发生这种情况。处理alert的理想方法是检查警报是否存在,然后在Alert类上调用所需的操作命令。

MoveTargetOutOfBoundsException

如果提供给ActionChainsmove()方法的目标超出范围(即无效或超出文档/网页),则抛出Selenium异常。

在调用ActionChains类的move()方法之前,应该始终检查我们尝试移动的位置,并仅在屏幕上存在该位置时才执行该操作。

NoSuchAttributeException

这是在执行自动浏览器测试时肯定会遇到的少数Selenium异常之一。字面意思,如果找不到元素的属性,则抛出NoSuchAttributeException

要处理此异常,应该为执行测试的浏览器检查属性的存在。同一属性的不同属性名称可能因浏览器而异,元素加载和处理效率低下可能导致此异常。

NoSuchCookieException

当当前浏览上下文的活动document的关联cookie中不存在与给定路径名匹配的cookie时,会发生此Selenium异常。

NoSuchElementException

当用于访问元素的定位器无效或试图对不在DOM上的元素执行操作时,将引发NoSuchElementException。在这两种情况下,都不会找到该元素。

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

StaleElementReferenceException


当对元素的引用不在页面的DOM上时,就会发生Selenium异常。简而言之,该元素已销毁或老旧。

此特定Selenium异常的某些可能原因是:

  • 该元素可能在刷新的iFrame中。
  • 该页面可能已刷新,并且要访问的元素不再是当前页面的一部分。
  • 由于元素已定位,但是不能被删除和重新添加到屏幕。

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

TimeoutException

当当前正在执行的命令未在预期的时间范围内完成时,就会发生TimeoutException

解决此异常的可能解决方案是增加命令完成执行的等待时间。但是,应为等待时间选择理想值,否则可能会延迟进一步执行。

UnableToSetCookieException

Selenium WebDriver无法设置cookie的情况下,会发生此Selenium异常。

可以添加额外的等待时间,以方便加载Cookie

UnexpectedAlertPresentException

当出现意外的alert。发生此异常的常见原因是由于页面上出现模态窗口/弹出窗口而导致Selenium WebDriver命令被阻止引发异常。

UnexpectedTagNameException

如果支持类无法找到所需的Web元素,则会发生此Selenium异常。

UnknownMethodException

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

WebDriverException

这是由于Selenium WebDriver和目标Web浏览器的绑定不兼容而发生的基本WebDriver异常。

要处理此异常,您应该下载与相应的Web浏览器兼容的Selenium WebDriver库。

Java中的Selenium异常

一些Selenium异常特定于用于测试自动化的特定编程语言。除了上一节中介绍的Selenium中的常见异常外,以下是特定于Java语言的Selenium异常:

ConnectionClosedException

Selenium WebDriver的连接丢失时,将引发此异常。

ErrorHandler.UnknownServerException

服务器返回错误而没有堆栈跟踪时,将抛出次异常。

JsonException

当没有会话被创建时候,获取会话对象时候,抛出次异常。

NoSuchSessionException

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

NotFoundException

DOM上不存在任何元素时,将发生此异常。

ScriptTimeoutException

当异步脚本的执行未在给定的时间限制内完成时,将引发该错误。

UnhandledAlertException

Selenium异常是WebDriver异常的子类。即使存在alterWebDriver也无法处理alter操作时,将引发该异常。

UnreachableBrowserException

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

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

UnsupportedCommandException

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

NoSuchContextException

此异常在移动测试中发生,并由ContextAware.context(String)引发

NotConnectedException

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

SeleniumException

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

UnableToCreateProfileException

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

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

UrlChecker.TimeoutException

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

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

C#中的Selenium异常

特定于C#Selenium异常是:

DriverServiceNotFoundException

当在其上执行自动浏览器测试的元素不可见时,将抛出DriverServiceNotFoundException类下的异常。

要处理此异常,仅在确认Web元素的存在可见性之后,可以尝试等待页面完全加载并执行Selenium WebDriver命令。

WebDriverTimeoutException

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

XPathLookupException

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

处理Selenium异常

Selenium异常的处理方式因一种编程语言而异。

以下是在主流的编程语言中如何处理Selenium异常的简要要点:

JavaSelenium异常是使用try-catch方法处理的。try块里面是需要执行的代码,catch块包含普包的异常。catch块放置在try块的末尾。也可以使用finally关键字创建一个代码块,无论是否发生异常,该代码块都会执行。

Python:如果使用Python进行自动浏览器测试,则selenium.common.exceptions中提供了异常类,应在使用该包中的任何命令之前将其导入。

异常是使用try ... except块进行处理的,其中try代码块中代码可以存在错误或者抛出异常,except代码块可以帮助处理错误,并且无论try块是否引发错误,都将执行可选的finally代码块。

C#:与Java一样,Selenium异常使用try-catch语句处理。try块包含可能导致异常的代码。在成功执行代码或抛出异常之前,将执行try块下的代码。catch块包含不同异常的处理程序。


公众号FunTester首发,原创分享爱好者,腾讯云、开源中国和掘金社区首页推荐,知乎准八级强者,欢迎关注、交流,禁止第三方擅自转载。

FunTester热文精选