• Selenium Video Tutorials

Selenium - 異常處理



可以使用 Selenium Webdriver 執行異常處理。在開發測試時,我們應該確保指令碼即使出現錯誤也能繼續執行。異常類似於在觸發測試執行時遇到的錯誤。

如果由於元素未找到或預期結果與實際結果不匹配或任何其他原因而發生異常,我們的程式碼應生成異常並以邏輯方式結束測試,而不是突然終止指令碼。異常分為兩種型別:

  • 已檢查異常 - 這些異常可以在程式碼編譯之前處理。

  • 未檢查異常 - 這些異常只能在執行時檢測到,並且比已檢查異常更難以處理。

識別和解決未檢查異常的方法稱為異常處理。Selenium 中的一些異常包括:

  • ElementNotVisibleException - 當元素存在於 DOM 中但不可見時,會引發此異常。因此,無法對其執行任何操作。

  • ElementNotInteractableException - 當元素存在於 DOM 中時,會引發此異常。但是,當對其執行操作時,另一個元素會受到影響。

  • ElementClickInterceptedException - 當無法完成元素單擊命令時,會引發此異常。這是因為接收事件的元素隱藏了請求單擊操作的元素。

  • ElementNotSelectableException - 當嘗試選擇不可選擇的元素時,會引發此異常。

  • InsecureCertificateException - 當導航導致出現證書警告時,會引發此異常。這導致建立了已過期和不正確的 TLS 證書。

  • ErrorInResponseException - 此異常是由於伺服器端錯誤而引發的。

  • ImeActivationFailedException - 此異常是由於 IME 引擎啟用失敗而引發的。

  • ImeNotAvailableException - 如果 IME 支援不可用,則會引發此異常。

  • InvalidElementStateException - 如果命令由於元素狀態無效而未完成,則會引發此異常。

  • InvalidArgumentException - 如果命令引數無效,則會引發此異常。

  • InvalidCoordinatesException - 如果操作的座標無效,則會引發此異常。

  • InvalidCookieDomainException - 為在不同域而不是當前 URL 下新增 Cookie 時引發此異常。

  • InvalidSwitchToTargetException - 當要切換到的目標視窗或框架不存在時,會引發此異常。

  • InvalidSelectorException - 如果用於標識元素的選擇器無法獲取 WebElement,則會引發此異常。

  • MoveTargetOutOfBoundsException - 當 ActionsChains move() 方法的目標無效時,會引發此異常。

  • InvalidSessionIdException - 如果提供的會話 ID 無效或不存在,並且不是活動會話的一部分,則會引發此異常。

  • NoSuchFrameException - 當要切換到的目標框架不存在時,會引發此異常。

  • NoAlertPresentException - 當要切換到的目標警報不存在時,會引發此異常。

  • NoSuchCookieException - 噹噹前活動瀏覽內容的 Cookie 中沒有匹配的 Cookie 時,會引發此異常。

  • NoSuchAttributeException - 當元素屬性丟失時,會引發此異常。

  • UnableToSetCookieException - 當驅動程式無法設定 Cookie 時,會引發此異常。

  • NoSuchWindowException - 當要切換到的目標視窗不存在時,會引發此異常。

  • TimeoutException - 當命令執行未在時間範圍內完成時,會引發此異常。

  • StaleElementReferenceException - 當元素引用當前已過期時,會引發此異常。

  • UnexpectedTagNameException - 當輔助類找不到正確的 Web 元素時,會引發此異常。

  • UnexpectedAlertPresentException - 當出現意外警報時,會引發此異常。

  • NoSuchElementException - 此異常是 NotFoundException 類的子類。當無法在 DOM 中識別元素時,通常由 findElement() 方法引發。

  • SessionNotFoundException - 當驅動程式嘗試在瀏覽器會話終止或關閉時對網頁執行某些操作時,會引發此異常。

  • WebDriverException - 當驅動程式在驅動程式會話關閉後立即嘗試工作時,會引發此異常。

讓我們討論一些處理異常的方法:

使用 try-catch 塊

try 指示塊的開始,catch 緊跟在 try 塊之後以解決異常。

語法

try {

   //Perform Action
} catch(Exception e1) {

   //Catch block 1
}

使用 try 和多個 catch 塊

某些程式碼片段可能產生多個異常。每個catch塊用於處理一種型別的異常。

語法

try {

   //Perform Action
} catch(Exception e1) {

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

   //Catch block 2
}

使用throw和throws

throw關鍵字用於生成自定義異常。如果丟擲異常而沒有處理它,則應該在方法簽名中提到throws關鍵字。

語法

public static void errorHandling() throws Exception
try {

   //Perform Action
} catch(Exception e) {

   throw(e);
}

使用try-catch-finally塊

try指示塊的開始,catch緊跟在try塊之後用於解決異常。finally程式碼塊無論指令碼是否丟擲異常都會執行。

語法

try {

   //Perform Action
} catch(Exception e1) {

   //Catch block 1
} finally {

   //The finally block always executes.
}
  • printStackTrace() − 此方法提供有關異常、堆疊跟蹤以及執行的其他關鍵資訊。

  • toString() − 此方法描述異常名稱及其用途。

  • getMessage() − 此方法描述異常。

讓我們來看一個例子,程式中遇到錯誤,由於程式碼中沒有異常處理,執行在中途停止。

示例

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://tutorialspoint.tw/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();
   }
}

輸出

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塊在上述測試中新增異常處理。

示例

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://tutorialspoint.tw/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();
   }
}

輸出

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

Process finished with exit code 0

在本教程中,我們討論瞭如何使用Selenium Webdriver執行異常處理。

廣告