Selenium 简明教程

Selenium - Exception Handling

可以使用 Selenium Webdriver 执行异常处理。在开发测试时,我们应该确保即使出现错误,脚本也可以继续执行。异常类似于在触发执行测试时遇到的错误。

如果由于找不到元素或预期结果与实际结果不符或由于任何其他原因导致异常,我们的代码应该生成异常并以合乎逻辑的方式结束测试,而不是突然终止脚本。异常有两种类型:

  1. Checked Exceptions - 在编译代码之前,可以考虑这些异常。

  2. Unchecked Exceptions - 这些异常只能在运行时检测到,并且比检查异常更难处理。

识别和解决未检查异常的方法被称为异常处理。Selenium 中提供的一些异常包括:

  1. ElementNotVisibleException − 当元素可用于 DOM 时生成此异常,但是它是不可见的。因此,无法对其执行任何操作。

  2. ElementNotInteractableException − 当元素可用于 DOM 时生成此异常。但是,在对其执行操作时,另一个元素受到影响。

  3. ElementClickInterceptedException − 当无法实现元素单击命令时生成此异常。这是因为接收事件的元素隐藏了请求单击操作的元素。

  4. ElementNotSelectableException − 当尝试选择不可选择的元素时生成此异常

  5. InsecureCertificateException − 当导航负责级联证书警告时,生成此异常。这导致创建过期的和不正确的 TLS 证书。

  6. ErrorInResponseException − 由于服务器端的错误而生成此异常。

  7. ImeActivationFailedException − 由于 IME 引擎未激活而生成此异常。

  8. ImeNotAvailableException − 如果 IME 支持不可用,则生成此异常。

  9. InvalidElementStateException − 如果由于元素状态无效导致命令不完整,则生成此异常

  10. InvalidArgumentException − 如果命令参数无效,则生成此异常。

  11. InvalidCoordinatesException − 如果操作的坐标无效,则生成此异常。

  12. InvalidCookieDomainException − 为另一个域而不是当前 URL 下添加 Cookie 而生成此异常。

  13. InvalidSwitchToTargetException − 当不存在要切换的目标窗口或帧时,生成此异常。

  14. InvalidSelectorException − 如果用于识别元素的选择器无法获取 WebElement,则生成此异常。

  15. MoveTargetOutOfBoundsException − 如果方法 ActionsChains move() 的目标无效,则生成此异常。

  16. InvalidSessionIdException − 如果提供的会话 ID 无效或不存在,并且不属于活动会话,则生成此异常。

  17. NoSuchFrameException − 当不存在要切换的目标帧时,生成此异常。

  18. NoAlertPresentException − 当不存在要切换的目标警报时,生成此异常。

  19. NoSuchCookieException − 当当前浏览活动内容的 cookie 中没有匹配的 cookie 时,会生成此异常。

  20. NoSuchAttributeException − 当元素属性缺失时,会生成此异常。

  21. UnableToSetCookieException − 当驱动程序无法设置 Cookie 时,会生成此异常。

  22. NoSuchWindowException − 当要切换到的目标窗口不存在时,会生成此异常。

  23. TimeoutException − 当命令执行未在时间范围内完成时,会生成此异常。

  24. StaleElementReferenceException − 当元素引用当前已过时时,会生成此异常。

  25. UnexpectedTagNameException − 当辅助类未找到正确的 Web 元素时,会生成此异常。

  26. UnexpectedAlertPresentException − 当出现意外警报时,会生成此异常。

  27. NoSuchElementException − 此异常是 NotFoundException 类的子类。当在 DOM 中无法识别元素时,通常由 findElement() 方法抛出。

  28. SessionNotFoundException − 当浏览器会话终止或关闭时,驱动程序尝试在 Web 页面上执行操作时,会抛出此异常。

  29. WebDriverException − 驱动程序会话关闭后,驱动程序尝试立即执行操作时,会抛出此异常。

让我们讨论一些处理异常的方法 −

Use try-catch block

try 表示块的开头,catch 放在 try 块后面,用于解决异常。

Syntax

try {

   //Perform Action
} catch(Exception e1) {

   //Catch block 1
}

Use try and multiple catch blocks

某些代码段可能会产生多个异常。每个 catch 块用于处理单一类型的异常。

Syntax

try {

   //Perform Action
} catch(Exception e1) {

   //Catch block 1
} catch(Exception e2) {

   //Catch block 2
}

Use throw and throws

throw 关键字用于生成自定义异常。如果不处理就抛出异常,则方法签名中应提及 throws 关键字。

Syntax

public static void errorHandling() throws Exception
try {

   //Perform Action
} catch(Exception e) {

   throw(e);
}

Use try-catch-finally block

try 表示块的开头,catch 放在 try 块后面,用于解决异常。无论脚本是否抛出异常,finally 代码块都会执行。

Syntax

try {

   //Perform Action
} catch(Exception e1) {

   //Catch block 1
} finally {

   //The finally block always executes.
}
  1. printStackTrace() − 这提供了有关异常、堆栈跟踪以及执行的其他关键信息。

  2. toString() − 这描述了异常名称及其目的。

  3. getMessage() − 这描述了异常。

让我们举个例子,其中在程序中遇到错误,并且由于代码中没有异常处理,导致执行中途停止。

Example

ExceptionsEncountered.java 类文件中的代码实现。

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ExceptionsEncountered {
   public static void main(String[] args) throws InterruptedException {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // launch an application and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/auto-complete.php");

      // identify element with incorrect xpath value
      WebElement l = driver.findElement(By.xpath("//*[@id='tag']"));

      // enter text
      l.sendKeys("Selenium");

      // Quitting browser
      driver.quit();
   }
}

Output

Exception in thread "main"
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element:
   {"method":"xpath","selector":"//*[@id='tag']"}
(Session info: chrome=121.0.6167.160)
For documentation on this error, please visit:
   https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception

Process finished with exit code 1

在上述示例中,我们收到了 NoSuchElementException。由于在上述实现中未应用异常处理,因此在遇到错误后立即停止了执行。

最后,收到了消息 Process finished with exit code 1 ,表示代码执行失败。

让我们看看如何使用 try-catch 和 finally 块在上述测试中添加异常处理。

Example

ExceptionHandlingEncountered.java 类文件中的代码实现。

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ExceptionHandlingEncountered {
   public static void main(String[] args) {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // launch an application and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/auto-complete.php");

      //try-catch finally block
      try {

         // identify element with incorrect xpath value
         WebElement l = driver.findElement(By.xpath("//*[@id='tag']"));

         // enter text
         l.sendKeys("Selenium");

      } catch (NoSuchElementException e){
         System.out.println("Catch block executed after try block");
      }

      // finally block
      finally {
         System.out.println("finally block executed after try - catch block");
      }

      // Quitting browser
      driver.quit();
   }
}

Output

Catch block executed after try block
finally block executed after try - catch block

Process finished with exit code 0

在本教程中,我们讨论了如何使用 Selenium Webdriver 执行异常处理。