当测试工程师执行 Selenium 测试自动化用例时,可能会遇到很多陌生的 Exception。在执行测试脚本时,有些Exception可能不是很常见,因为测试用例锁依赖的测试框架拥有足够健壮性以应对此类场景。
这些未被预期的场景被称为异常场景,在使用 Selenium 进行自动浏览器测试时,通常来讲会遇到很多异常场景。
Selenium
异常广泛用于处理错误情况并避免Web 应用程序故障。尽管在所有Selenium WebDriver
代码中都可能发生许多Selenium
异常,但是某些Selenium
异常基于特定于框架支持的编程语言,例如Java
、C#
、Python
等。本文将介绍了常见的Selenium
通用的异常以及特定于语言的异常。这是一个详尽的列表,当你在代码中遇到异常时可能会有所帮助。
Selenium
异常简介
异常(Exception
)是在程序执行过程中发生的未预期的事件。发生异常时,正常程序的执行将停止,并执行相应的异常处理逻辑。如果没有异常处理程序来处理该特定异常,程序将返回引发异常的调用函数,最终导致程序或者线程终止。
由于Selenium
测试自动化是在不同的目标平台、设备和浏览器上执行的,测试代码的行为可能会因浏览器类型或浏览器版本不同而有所差别。例如,某些属性可能是浏览器特定的,并且如果在执行自动浏览器测试的浏览器中不存在特定属性,则会引发异常。通用属性名称也可以是特定于浏览器的,如果目标浏览器上没有相同的属性,则可能导致Selenium 异常,例如常见的NoSuchAttributeException
。
正确捕获/处理异常是一个好习惯,因为未处理的异常会导致程序失败而终止,从而最终影响终端用户体验。异常对象包含有关异常类型,调用堆栈和异常信息等内容,这些信息将有助于调试并使代码更可靠。
Selenium 异常分类
Selenium
异常分为两大类:已检查的异常和未检查的异常。这些异常根据捕获异常的时间(即编译时或运行时)进行分类。
Checked Exceptions
Selenium
测试自动化中的已检查异常是在测试代码实现过程中处理的,例如前面提到的NoSuchAttributeException
等,已检查异常的处理发生在编译代码时。
如果某些方法引发了检查的异常,则最好定义一个处理该特定异常的处理逻辑代码。
Unchecked Exceptions
Selenium
测试自动化中未检查的异常会在运行时发生,并且比检查异常会产生严重的影响。例如ElementNotVisibleException
、MoveTargetOutOfBoundsException
等。
与浏览器自动测试相关的场景中,经常会遇到未经检查的异常,因为这些测试涉及浏览器和操作系统的不同组合和版本,包括网络和异步加载等因素都会导致未检查异常的发生。
Selenium 异常备忘单
在本地浏览器或远程Selenium
平台上执行自动浏览器测试时,测试人员会遇到很多类型的异常。一些Selenium
异常特定于用于编写Selenium
测试自动化方案的编程语言。
常见的 Selenium 异常
以下是所有Selenium WebDriver
代码中可能发生的一些常见 Selenium 异常。
ElementClickInterceptedException
由于以某种方式隐藏了接收到click
命令的元素,因此无法正确执行Element Click
命令。
ElementNotInteractableException
即使目标 Web 元素存在于 DOM 上,但与该元素的交互将击中另一个 Web 元素时,也会抛出此ElementNotInteractableException
的Selenium
异常。
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
当尝试添加cookie
的URL/host
与当前URL
不同时,将抛出此Selenium
异常。
要处理此异常,测试人员编写代码时应该导航到必须在其中添加Cookie
的正确URL
地址。
InvalidCoordinatesException
将错误的坐标提供给交互操作时,将引发此特定异常。
这也意味着依赖于鼠标位置(例如单击)的动作之前没有进行移动操作,或者为移动操作提供了无效的坐标。
InvalidElementStateException
当命令无法完成时会抛出此Selenium
异常,因为该元素处于无效状态或未启用该元素来执行该操作。如果在不可编辑且不可重置的Web元素
上尝试执行诸如清除元素之类的操作,可能会导致这种异常的出现。
要在Selenium
测试自动化中处理此类异常,建议在对该元素执行所需的操作之前等待该元素被启用或者在操作之前进行检查。
InvalidSelectorException
如果在不同版本之间更改了选择器名称,则可能会意外使用无效或不正确的选择器来定位 Web 元素。如果用于查找 Web 元素的选择器未返回WebElement
,则抛出InvalidSelectorException
。
当XPath
表达式是选择器并且XPath
无效时,通常会发生这种情况。这将导致无法找到所需的 Web 元素。
InvalidSessionIdException
如果在Selenium
测试自动化实现中使用的会话ID
无效,即不在当前活动的会话列表中,则抛出此异常。如果会话处于非活动状态或从未存在过,则可能发生这种情况。
InvalidSwitchToTargetException
如果要切换到的iframe
或window你
目标无效,则会出现此Selenium
异常。在切换到该iframe
之前,请使用检查工具验证目标框架的XPath
,可以避免次异常的发生。
JavascriptException
执行JavaScrip
t 代码时出现问题时,抛出此异常。
NoAlertPresentException
当切换到屏幕上尚不存在的alert
时,会发生这种情况。处理alert
的理想方法是检查警报是否存在,然后在Alert
类上调用所需的操作命令。
MoveTargetOutOfBoundsException
如果提供给ActionChains
的move()
方法的目标超出范围(即无效或超出文档/网页),则抛出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
异常的子类。即使存在alter
,WebDriver
也无法处理alter
操作时,将引发该异常。
UnreachableBrowserException
UnreachableBrowserException
表示与由自动化测试代码控制的 Web 浏览器通信时出现问题。也可能是由于与Selenium
服务器通信时出现问题。
如果远程Selenium WebDriver
或Selenium
网格的服务器地址无效时,则会发生这种情况。浏览器实例也有可能在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 异常的简要要点:
Java:Selenium
异常是使用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首发,原创分享爱好者,腾讯云、开源中国和掘金社区首页推荐,知乎准八级强者,欢迎关注、交流,禁止第三方擅自转载。