错误是:
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();
答案 0 :(得分:13)
Element is not reachable by keyboard
用简单的单词表示使用键盘无法访问该元素,这意味着您甚至无法与其进行物理交互。
错误背后可能有多种原因元素无法通过键盘访问,可以是以下任意一种:
hidden
属性可以通过以下任一方式实现:
class="ng-hide"
, style="display: none"
等click()
或sendKeys()
标记上调用<p>
或<div>
,而是调用{{1}在Official locator strategies for the webdriver。click()
标记上
有不同的方法来解决这个问题。
临时覆盖 使用WebDriverWait与ExpectedConditions联系,以使所需的元素可见/可点击< / em>如下:
<input>
永久叠加 使用executeScript()
界面中的JavascriptExecutor方法,如下所示:
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.nsg-button"))).click();
包含属性的存在,例如 import org.openqa.selenium.JavascriptExecutor;
String inputText = "Rozmeen";
WebElement myElement = driver.findElement(By.id("u_0_b"));
String js = "arguments[0].setAttribute('value','"+inputText+"')"
((JavascriptExecutor) driver).executeScript(js, myElement);
, class="ng-hide"
等使用executeScript()
界面中的JavascriptExecutor方法修改并重置 { {1}} 属性为 style="display: none"
,如下所示:
style="display: none"
如果您查看 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
Firefox功能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()并单击了按钮。