facebook selenium react-native selenium-webdriver webdriver

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() o sendKeys() en ninguna etiqueta <p> o <div> , en lugar de invocar click() 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étodo executeScript() desde la interfaz JavascriptExecutor para editar y restablecer el atributo style="display: none" a style="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

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.