org.openqa.selenium.ElementNotInteractableException: el teclado no puede acceder al elemento: al enviar texto al campo FirstName en Facebook
react-native selenium-webdriver (2)
El error es:
Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: Element <div id="u_0_b" class="_5dbb"> is not reachable by keyboard
El codigo es:
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: el teclado no puede acceder al elemento
Element is not reachable by keyboard
en palabras simples significa que no se puede llegar al elemento usando el teclado, lo que significa que ni siquiera interactuarás físicamente con él.
Razón
Puede haber múltiples razones detrás del error. El teclado no puede acceder al elemento, que puede ser uno de los siguientes:
-
El elemento está
oculto
ya que los estilos de interfaz de usuario modernos centrados en JavaScript siempre mantienen oculto el feo campo de entrada HTML sin procesar.
El atributo
hidden
podría haberse implementado de cualquiera de las siguientes maneras:- Una superposición temporal de algún otro elemento sobre el elemento deseado.
- Una superposición permanente de algún otro elemento sobre el elemento deseado.
-
Presencia de atributos, por ejemplo,
class="ng-hide"
,style="display: none"
, etc. -
Según las mejores prácticas al enviar la secuencia de caracteres, no debe intentar invocar
click()
osendKeys()
en ninguna etiqueta<p>
o<div>
, en lugar de invocarclick()
en la etiqueta<input>
deseada siguiendo las estrategias del localizador oficial para el webdriver
Solución
Existen diferentes enfoques para abordar este problema.
-
En caso de una superposición temporal, use WebDriverWait combinación con ExpectedConditions para que el elemento deseado sea visible / haga clic de la siguiente manera:
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();
-
En caso de superposición permanente, utilice el método
executeScript()
de la interfaz JavascriptExecutor siguiente manera: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);
Encontrará una discusión detallada en Uso de JS para ingresar texto, pero si ingreso texto en un cuadro de texto, el valor ya ingresado se eliminará
-
En caso de presencia de atributos, por ejemplo,
class="ng-hide"
,style="display: none"
, etc., utilice el métodoexecuteScript()
desde la interfaz JavascriptExecutor para editar y restablecer el atributostyle="display: none"
astyle="display: block"
siguiente manera:import org.openqa.selenium.JavascriptExecutor; ((JavascriptExecutor) driver).executeScript("document.getElementById(''ID'').style.display=''block'';");
Encontrará una discusión detallada en No se puede completar el elemento del área de texto Oculto
Referencias
- Para la entrada [type = file], debe permitir sendKeys incluso cuando display = none
- Controles de carga de archivos con carcasa especial en la comprobación de interactibilidad del teclado
- El elemento no es accesible por teclado
- Campo de entrada con pantalla: ¿ninguno no es interactivo?
Este problema en particular
Si observa el
HTML
de la
página de
inicio de sesión de
Facebook
, la aplicación contiene elementos
React
Native
.
Por lo tanto, un elemento una vez representado con una
id
como
u_0_b
en su sistema puede no estar representado por la misma
id
que
u_0_b
en la próxima ejecución en su sistema.
Por lo tanto, tenemos que tomar la ayuda de
la estrategia de localización dinámica
.
Puede usar el siguiente bloque de código para realizar los pasos previstos:
-
Bloque de código:
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();
-
Cliente de navegador:
Actualizar
Abordar el error:
org.openqa.selenium.ElementNotInteractableException: Element is not reachable by keyboard
Se ha vuelto más fácil con la disponibilidad de la capacidad de Firefox moz:webdriverClick
moz: webdriverClick ()
A través de
webdriverClick()
puede pasar un valor booleano para indicar qué tipo de comprobaciones de interactividad ejecutar al realizar un clic o enviar claves a un elemento.
Para
Firefoxen
anterior a
v58.0, se estaba utilizando
algún código heredado importado de una versión anterior de
FirefoxDriver
.
Con la disponibilidad de
Firefox v58,
las comprobaciones de interactibilidad requeridas por la
especificación WebDriver
están habilitadas de forma predeterminada.
Esto significa que geckodriver verificará adicionalmente si un elemento está oculto por otro al hacer clic, y si un elemento es enfocable para enviar claves.
Debido a este cambio en el comportamiento, somos conscientes de que podrían devolverse algunos errores adicionales.
En la mayoría de los casos, la prueba en cuestión podría tener que actualizarse para que se ajuste a las nuevas comprobaciones.
Para deshabilitar temporalmente las comprobaciones conformes de WebDriver, utilice
false
como valor para esta capacidad.
Nota : Esta capacidad existe solo temporalmente y se eliminará una vez que se hayan estabilizado las comprobaciones de interactibilidad.
Puedes probar este código :
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);
}
}
pruebe este código y hágame saber el estado.