org.openqa.selenium.ElementNotInteractableException:键盘无法访问元素:向 Facebook 中的 FirstName 字段发送文本时 [英] org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard: while sending text to FirstName field in Facebook
问题描述
错误是:
线程main"中的异常 org.openqa.selenium.ElementNotInteractableException: Element <div id="u_0_b" class="_5dbb">无法通过键盘访问
代码为:
System.setProperty("webdriver.gecko.driver","//Users//rozali//Documents//Selenium//geckodriver");WebDriver driver = new FirefoxDriver();driver.get("http://www.facebook.com");driver.manage().window().maximize();//输入名字driver.findElement(By.id("u_0_b")).click();driver.findElement(By.id("u_0_b")).sendKeys("测试它");//出生日期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");//点击注册driver.findElement(By.id("u_0_t")).click();
ElementNotInteractableException: Element is not reachable by keyboard
Element is not reachable by keyboard
简而言之,意味着无法使用键盘访问该元素,这意味着您甚至不会与它进行物理交互.
原因
错误的背后可能有多种原因键盘无法访问元素,可能是以下任一原因:
- 元素被隐藏,因为现代以 JavaScript 为中心的 UI 样式总是隐藏丑陋的原始 HTML 输入字段.
hidden
属性可以通过以下任一方式实现:- 在所需元素上临时叠加一些其他元素.
- 其他元素在所需元素上的永久覆盖.
- 存在属性,例如
class="ng-hide"
、style="display: none"
等 - 根据发送字符序列时的最佳做法,您不得尝试在任何
<p>上调用
click()
或sendKeys()
code> 或<div>
标记,而是在
更新
解决错误:
org.openqa.selenium.ElementNotInteractableException: 键盘无法访问元素
随着 Firefox 功能的可用性变得更加容易 moz:webdriverClick
moz:webdriverClick()
通过
webdriverClick()
,您可以传递一个布尔值来指示在执行单击或向元素发送键时要运行哪种交互性检查.对于 v58.0 之前的 Firefoxen,一些遗留代码是从旧版本的 FirefoxDriver 正在使用中.随着 Firefox v58 的推出,WebDriver 规范要求的可交互性检查默认启用.这意味着 geckodriver 将额外检查一个元素在单击时是否被另一个元素遮挡,以及一个元素是否可以聚焦以发送键.由于这种行为变化,我们知道可能会返回一些额外的错误.在大多数情况下,可能需要更新相关测试以符合新的检查.要暂时禁用 WebDriver 一致性检查,请使用
false
作为此功能的值.注意:此功能只是暂时存在,一旦交互性检查稳定,它将被移除.
The error is :
Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: Element <div id="u_0_b" class="_5dbb"> is not reachable by keyboard
The code is:
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();
解决方案ElementNotInteractableException: Element is not reachable by keyboard
Element is not reachable by keyboard
in plain words means that the element can’t be reached using the keyboard, which means you won't be physically interact with it even.Reason
There can be multiple reasons behind the error Element is not reachable by keyboard which can be either of the following:
- The element is hidden as modern JavaScript-centric UI styles always keep the ugly raw HTML input field hidden. The
hidden
attribute could have been implemented through either of the following ways:- A temporary overlay of some other element over the desired element.
- A permanent overlay of some other element over the desired element.
- Presence of attributes e.g.
class="ng-hide"
,style="display: none"
, etc - As per best practices while sending character sequence, you must not attempt to invoke
click()
orsendKeys()
on any<p>
or<div>
tag, instead invokeclick()
on the desired<input>
tag following the Official locator strategies for the webdriver.
Solution
There are different approaches to address this issue.
Incase of temporary overlay use WebDriverWait inconjunction with ExpectedConditions for the desired element to be visible/clickable as follows:
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();
Incase of permanent overlay use
executeScript()
method from JavascriptExecutor interface as follows: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);
You will find a detailed discussion in Using JS to enter text, but if I input text in one text box, the value already entered is getting deleted
Incase presence of attributes e.g.
class="ng-hide"
,style="display: none"
, etc useexecuteScript()
method from JavascriptExecutor interface to edit and reset thestyle="display: none"
attribute tostyle="display: block"
as follows:import org.openqa.selenium.JavascriptExecutor; ((JavascriptExecutor) driver).executeScript("document.getElementById('ID').style.display='block';");
You will find a detailed discussion in Can't fill in the Hidden text area element
References
- For input[type=file], should allow sendKeys even when display=none
- Special-casing file upload controls in keyboard-interactability check
- Element is not reachable by keyboard
- Input field with display: none is not interactable at all?
This particular issue
If you look into the HTML of Facebook login page, the application contains React Native elements. So an element once represented with
id
as u_0_b in your system may not be represented by the sameid
as u_0_b in the next run on your system. Hence, we have to take help of Dynamic Locator Strategy. You can use the following code block to perform your intended steps :Code Block :
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();
Browser Client :
Update
Addressing the error:
org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard
Have become more easier with the availability of Firefox capability moz:webdriverClick
moz:webdriverClick()
Through
webdriverClick()
you can pass a boolean value to indicate which kind of interactability checks to run when performing a click or sending keys to an elements. For Firefoxen prior to v58.0 some legacy code as imported from an older version of FirefoxDriver was in use. With the availability of Firefox v58 the interactability checks as required by the WebDriver specification are enabled by default. This means geckodriver will additionally check if an element is obscured by another when clicking, and if an element is focusable for sending keys. Because of this change in behaviour, we are aware that some extra errors could be returned. In most cases the test in question might have to be updated so it's conform with the new checks.To temporarily disable the WebDriver conformant checks use
false
as value for this capability.Note: This capability exists only temporarily, and that it will be removed once the interactability checks have been stabilized.
这篇关于org.openqa.selenium.ElementNotInteractableException:键盘无法访问元素:向 Facebook 中的 FirstName 字段发送文本时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!