org.openqa.selenium.ElementNotInteractableException:键盘无法访问元素:在Facebook中将文本发送到FirstName字段时

时间:2018-04-16 19:35:44

标签: facebook selenium react-native selenium-webdriver webdriver

错误是:

Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: Element <div id="u_0_b" class="_5dbb"> is not reachable by keyboard

代码为:

System.setProperty("webdriver.gecko.driver","//Users//rozali//Documents//Selenium//geckodriver");
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.facebook.com");
    driver.manage().window().maximize();

    //entering first name
    driver.findElement(By.id("u_0_b")).click();
    driver.findElement(By.id("u_0_b")).sendKeys("testing it ");

    //DOB
    Select sel1 = new Select(driver.findElement(By.xpath(".//*[@id='month']")));
    sel1.selectByIndex(4);

    Select sel2 = new Select(driver.findElement(By.xpath(".//*[@id='day']")));
    sel2.selectByValue("6");

    Select sel3 = new Select(driver.findElement(By.xpath(".//*[@id='year']")));
    sel3.selectByValue("2013");

    //clicking sign up
    driver.findElement(By.id("u_0_t")).click();

4 个答案:

答案 0 :(得分:13)

ElementNotInteractableException:键盘无法访问元素

Element is not reachable by keyboard用简单的单词表示使用键盘无法访问该元素,这意味着您甚至无法与其进行物理交互。

原因

错误背后可能有多种原因元素无法通过键盘访问,可以是以下任意一种:

  • 元素隐藏,因为现代以JavaScript为中心的UI样式始终隐藏丑陋的原始HTML输入字段。 hidden属性可以通过以下任一方式实现:
    • 所需元素上的其他元素的 临时叠加
    • 所需元素上的其他元素的 永久叠加
    • 属性的存在,例如 class="ng-hide" style="display: none"
    • 根据发送字符序列时的最佳做法,您不得尝试在任何click()sendKeys()标记上调用<p><div>,而是调用{{1}在Official locator strategies for the webdriver
    • 之后的所需click()标记上

解决方案

有不同的方法来解决这个问题。

参考

这个特殊问题

如果您查看 Facebook 登录页面的 HTML ,该应用程序将包含React Native元素。因此,在您的系统中使用style="display: block"作为 u_0_b 表示的元素在下次运行时可能无法与 u_0_b 表示相同的import org.openqa.selenium.JavascriptExecutor; ((JavascriptExecutor) driver).executeScript("document.getElementById('ID').style.display='block';"); 系统。因此,我们必须借助动态定位器策略。您可以使用以下代码块执行预期的步骤:

  • 代码块:

    id
  • 浏览器客户端:

    FacebookRegistration

更新

解决错误:

id

Firefox功能moz:webdriverClick

的可用性变得更加容易

MOZ:webdriverClick()

通过 System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("https://www.facebook.com"); driver.findElement(By.xpath("//input[@name='firstname' and contains(@class,'inputtext')]")).sendKeys("testing it "); //DOB Select sel1 = new Select(driver.findElement(By.xpath(".//*[@id='month']"))); sel1.selectByIndex(4); Select sel2 = new Select(driver.findElement(By.xpath(".//*[@id='day']"))); sel2.selectByValue("6"); Select sel3 = new Select(driver.findElement(By.xpath(".//*[@id='year']"))); sel3.selectByValue("2013"); //clicking sign up driver.findElement(By.xpath("//button[@name='websubmit' and contains(.,'Sign Up')]")).click(); ,您可以传递一个布尔值,以指示在执行单击或向元素发送键时要检查哪种交互性检查。对于 v58.0 之前的 Firefoxen ,正在使用从旧版FirefoxDriver导入的一些旧版代码。随着 Firefox v58 的可用性,默认情况下会启用WebDriver specification所需的交互式检查。这意味着geckodriver将另外检查一个元素在点击时是否被另一个元素遮挡,以及一个元素是否可以用于发送键。由于行为的这种变化,我们意识到可能会返回一些额外的错误。在大多数情况下,可能必须更新有问题的测试,以使其符合新的检查。

要暂时停用符合WebDriver标准,请使用 org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard 作为此功能的值。

注意:此功能仅暂时存在,并且在相互作用性检查稳定后将被删除。

答案 1 :(得分:1)

在其中一个用例中,我遇到了相同的问题:

Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: Element <div id="search"> is not reachable by keyboard

在发送密钥之前使用id标识元素。像这样:

driver.findElement(By.id("search")).sendKeys("...");

测试后,我改用CSS选择器,它解决了这个问题:

driver.findElement(By.cssSelector("#search > input:nth-child(2)")).sendKeys("...");

因此,我强烈建议使用其他方法与元素进行交互,因为其他方法可以节省您解决问题的时间。

答案 2 :(得分:0)

您可以尝试代码

public class Rozmeen{

    static WebDriver driver;
    static WebDriverWait wait;

    public static void main(String[] args) throws InterruptedException {
            System.setProperty("webdriver.gecko.driver", "F:\\Automation\\geckodriver.exe");
            driver = new FirefoxDriver();
            driver.manage().window().maximize();
            WebDriverWait wait = new WebDriverWait(driver, 40);
            driver.get("http://www.facebook.com");

            //entering first name
            wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("pagelet_bluebar"))));
            driver.findElement(By.name("firstname")).sendKeys("testing it ");

            //DOB
            selectFromDropDown(driver.findElement(By.name("birthday_day")), "4");
            selectFromDropDown(driver.findElement(By.name("birthday_month")), "Jun");
            selectFromDropDown(driver.findElement(By.name("birthday_year")), "2013");

            //clicking sign up
            wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.name("websubmit"))));
            driver.findElement(By.name("websubmit")).click();
        }



        public static void selectFromDropDown(WebElement element , String Visibletext){
            Select select = new Select(element);
            select.selectByVisibleText(Visibletext);
        }
}  

试用这段代码,让我知道状态。

答案 3 :(得分:0)

我在执行click()操作时在按钮上遇到了类似的问题,org.openqa.selenium.ElementNotInteractableException异常正在显示。正如DebanjanB在回答中提到的那样,该元素无法通过键盘访问。 为了解决这个问题,用sendKeys(Keys.ENTER)替换了click()并单击了按钮。