如何在 Selenium 中解決元素不可互動異常?


我們可以用 Selenium webdriver 來解決異常 – ElementNotInteractableException。如果 Web 元素存在於 DOM 中但無法訪問,就會丟擲此異常。下圖顯示了此類異常的一個示例。

如果特定 Web 元素被另一個 Web 元素覆蓋,我們通常會得到此異常。為了修復此問題,我們可以應用顯式等待,以便 WebDriver 等待預期條件 - 覆蓋 Web 元素的 overlaying webelement 的不可見性。

或者,我們可以在我們要與其進行互動的 Web 元素上應用預期條件 - elementToBeClickable。要解決永久覆蓋,我們必須使用 JavaScript 執行器來執行單擊操作。Selenium 利用 executeScript 方法來執行 JavaScript 命令。

語法

WebDriverWait wait= (new WebDriverWait(driver, 5));
wait.until(ExpectedConditions . elementToBeClickable (By.id("element id")));
//alternate solution
wait.until(ExpectedConditions. invisibilityOfElementLocated(By.id("overlay element id")));
//fix with JavaScript executor
WebElement m = driver.findElement(By.id("element id"));
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("arguments[0].click();", m);

示例

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.JavascriptExecutor;
public class InteractableExceptResolve{
   public static void main(String[] args) {
      System.setProperty("webdriver.chrome.driver", "C:\Users\ghs6kor\Desktop\Java\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      //launch URL
      driver.get("https://login.yahoo.com/");
      //identify element
      WebElement m = driver.findElement(By.xpath("//input[@id='persistent']"));
      //JavascriptExecutor to click element
      JavascriptExecutor jse = (JavascriptExecutor) driver;
      jse.executeScript("arguments[0].click();", m);
      boolean b = m.isSelected();
      if (b) {
         System.out.println("Checkbox is not checked");
      }else {
         System.out.println("Checkbox is checked");
      }
      driver.close();
   }
}

輸出

更新於:22-Oct-2023

24K+ 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始
廣告