元素不可交互的异常在硒 Web 自动化

在下面的代码中,我无法在密码字段中发送密码密钥,我尝试单击该字段,清除该字段并发送密钥。但现在在任何一种方法中都可以工作。但是如果我调试和测试,它的工作原理

  public class TestMail {
   protected static WebDriver driver;

   protected static String result;

   @BeforeClass

   public static void setup()  {
              System.setProperty("webdriver.gecko.driver","D:\\geckodriver.exe");

   driver = new FirefoxDriver();

   driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

  }

   @Test

 void Testcase1() {

   driver.get("http://mail.google.com");

   WebElement loginfield = driver.findElement(By.name("Email"));
   if(loginfield.isDisplayed()){
       loginfield.sendKeys("ragesh@gmail.in");
   }
   else{
  WebElement newloginfield = driver.findElemnt(By.cssSelector("#identifierId"));                                      
       newloginfield.sendKeys("ragesh@gmail.in");
      // System.out.println("This is new login");
   }


    driver.findElement(By.name("signIn")).click();

  // driver.findElement(By.cssSelector(".RveJvd")).click();

   driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
 // WebElement pwd = driver.findElement(By.name("Passwd"));
  WebElement pwd = driver.findElement(By.cssSelector("#Passwd"));

  pwd.click();
  pwd.clear();
 // pwd.sendKeys("123");
 if(pwd.isEnabled()){
     pwd.sendKeys("123");
 }
 else{
     System.out.println("Not Enabled");
 }

答案 1

尝试将隐式等待设置为 10 秒。

gmail.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

或者设置显式等待。显式等待是您定义的代码,用于在代码中继续执行特定条件之前等待特定条件发生。在您的情况下,它是密码输入字段的可见性。(感谢ainlolcat的评论)

WebDriver gmail= new ChromeDriver();
gmail.get("https://www.gmail.co.in"); 
gmail.findElement(By.id("Email")).sendKeys("abcd");
gmail.findElement(By.id("next")).click();
WebDriverWait wait = new WebDriverWait(gmail, 10);
WebElement element = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("Passwd")));
gmail.findElement(By.id("Passwd")).sendKeys("xyz");

说明:selenium 找不到该元素的原因是因为密码输入字段的 ID 最初是 Passwd 隐藏的。点击“下一步”按钮后,Google首先验证输入的电子邮件地址,然后显示密码输入字段(通过将ID从Passwd隐藏更改为Passwd)。因此,当密码字段仍然隐藏时(即Google仍在验证电子邮件ID),您的网络驱动程序开始搜索id Passwd的密码输入字段,该字段仍然隐藏。因此,将引发异常。


答案 2

“元素不可交互”错误可能意味着两件事:

a. 元素未正确呈现:

对此的解决方案只是使用隐式/显式等待

  • 隐式等待:

    driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);

  • 显式等待:

    WebDriverWait wait=new WebDriverWait(driver, 20);element1 = wait.till(ExpectedConditions.elementToBeClickable(By.className(“fa-stack-1x”)));

b. 元素已呈现,但它不在屏幕的可见部分:

解决方案只是滚动到元素。基于硒的版本,它可以以不同的方式处理,但我将提供一个适用于所有版本的解决方案:

    JavascriptExecutor executor = (JavascriptExecutor) driver;
    executor.executeScript("arguments[0].scrollIntoView(true);", element1);
  1. 假设所有这些都失败了,那么另一种方法是再次使用Javascript执行器,如下所示:

    executor.executeScript(“arguments[0].click();”, element1);

  2. 如果您仍然无法单击 ,那么它可能再次意味着两件事:

1. 框架

检查 DOM 以查看您正在检查的元素是否存在于任何帧中。如果这是真的,那么在尝试任何操作之前,您需要切换到此帧。

    driver.switchTo().frame("a077aa5e"); //switching the frame by ID
    System.out.println("********We are switching to the iframe*******");
    driver.findElement(By.xpath("html/body/a/img")).click();

2. 新选项卡

如果打开了一个新选项卡并且该元素存在于其中,那么您再次需要编写如下代码以在尝试操作之前切换到它。

String parent = driver.getWindowHandle();
driver.findElement(By.partialLinkText("Continue")).click();
Set<String> s = driver.getWindowHandles();
// Now iterate using Iterator
Iterator<String> I1 = s.iterator();
while (I1.hasNext()) {
String child_window = I1.next();
if (!parent.equals(child_window)) {
    driver.switchTo().window(child_window);
    element1.click() 
}

推荐