如何解决Selenium WebDriver的sendKeys方法抛出的ElementNotInteractableException?

时间:2018-06-27 20:12:16

标签: java html selenium selenium-webdriver sendkeys

作为学习Selenium WebDriver的练习,我试图访问Twitter log in page并登录。我终于能够导航到页面并为用户名字段获取所需的*元素:

<input class="text-input email-input js-signin-email" name="session[username_or_email]" type="text">

*我试图找到sendKeys可以使用哪些类型的元素,但我找不到。我认为该元素是我想要的元素,因为代码是<input>类型。

在分配元素后在元素上调用sendKeys时,会得到ElementNotInteractableException。我尝试对ExpectedConditionsvisibilityOf的{​​{1}}使用显式等待。 invisibilityOfTimeoutException的相应解释告诉我,我上面提到的元素加载到DOM树中,但从不可见*。我该如何解决?是否有使用ElementNotInteractableException的解决方案?

*周围的html可能会揭示元素为何保持不可见的原因:

JavascriptExecutor

**对于那些正在寻找猎物的人,this问题很有帮助,特别是如果问题是由<form class="t1-form clearfix signin js-signin" action="https://twitter.com/sessions" method="post"> ::before <fieldset> <legend class="visuallyhidden">Log in</legend> <div class="clearfix field"> ::before <input class="text-input email-input js-signin-email" name="session[username_or_email]" type="text"> 方法引起的。

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码:

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.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class Test  {
  public static void main(String[] args) throws InterruptedException {
    final WebDriver driver = new ChromeDriver();

    driver.get("https://twitter.com/login?lang=en");

    WebDriverWait wait = new WebDriverWait(driver, 10);

    // locate login input
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@placeholder = 'Phone, email or username']")));
    WebElement loginInput = driver.findElement(By.xpath("//input[@placeholder = 'Phone, email or username']"));
    loginInput.click();
    loginInput.sendKeys("login");

    // locate password input
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//fieldset//input[@placeholder = 'Password']")));
    WebElement passInput = driver.findElement(By.xpath("//fieldset//input[@placeholder = 'Password']")); // this xPath does the trick
    passInput.click();
    passInput.sendKeys("password");
    Thread.sleep(3000); // only to see the result

    //locate submit button
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//button[@type= 'submit']")));
    WebElement submitBtn = driver.findElement(By.xpath("//button[@type= 'submit']"));
    submitBtn.click();

    Thread.sleep(3000); // only to see the result
    driver.quit();
  }
}

答案 1 :(得分:1)

编辑:虽然我在StackOverflow上没有看到这个问题,但是显然我没有做足够的研究。离开这个问题,以防有人帮助。

使用JavascriptExecutor(来源1):

  1. 导入:import org.openqa.selenium.JavascriptExecutor;
  2. 总体思路:JavascriptExecutor executor= (JavascriptExecutor) driver; executor.executeScript(script, arguments);
  3. 对于sendKeys替代方案,我们需要执行一些JS,该JS使用点表示法设置元素的文本值。我们必须首先找到元素。 (来源1。)使用document.getElementById('id')document.getElementsByTagName('name')document.getElementsByClassName('class')查找元素(来源2)。请注意,在最后两个用于查找元素的选项中,收集了多个元素,因此请为所需的索引。

原来是我的解决方案的示例代码行: executor.executeScript("document.getElementsByClassName('js-username-field email-input js-initial-focus')[0].value='someValue';");

请注意,.getElementById('id')可能是首选,但在我的情况下,网站设计者决定不合作,不提供id属性。

以下是有关该主题的两个(令人难以置信的!)资源-签出来!

  1. https://www.softwaretestingmaterial.com/javascriptexecutor-selenium-webdriver/
  2. https://www.w3schools.com/js/js_htmldom_document.asp