web-dev-qa-db-de.com

org.openqa.Selenium.ElementNotInteractableException: Element ist nicht über die Tastatur erreichbar: beim Senden von Text an das Feld Vorname in Facebook

Der Fehler ist: 

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

Der Code lautet:

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();
3
Rozmeen

ElementNotInteractableException: Element ist nicht über die Tastatur erreichbar

Element is not reachable by keyboard In einfachen Worten bedeutet, dass das Element nicht über die Tastatur erreicht werden kann. Dies bedeutet, dass Sie nicht einmal physisch damit interagieren.

Grund

Es kann mehrere Gründe für den Fehler geben Das Element ist über die Tastatur nicht erreichbar. Dies kann einer der folgenden Gründe sein:

  • Das Element ist ausgeblendet , da moderne JavaScript-zentrierte UI-Stile das hässliche rohe HTML-Eingabefeld immer ausgeblendet lassen. Das hidden -Attribut konnte auf eine der folgenden Arten implementiert werden:
    • Eine temporäre Überlagerung eines anderen Elements über dem gewünschten Element.
    • Eine permanente Überlagerung eines anderen Elements über dem gewünschten Element.
    • Vorhandensein von Attributen, z.B. class="ng-hide", style="display: none", usw
    • Gemäß den Best Practices beim Senden von Zeichenfolgen dürfen Sie nicht versuchen, click() oder sendKeys() auf einem Tag <p> Oder <div> Aufzurufen, sondern click() auf dem gewünschten <input> - Tag gemäß den offiziellen Suchstrategien für den Webdriver .

Lösung

Es gibt verschiedene Ansätze, um dieses Problem anzugehen.

  • Bei temporärer Überlagerung verwenden Sie WebDriverWait inkonjunktion mit ExpectedConditions damit das gewünschte Element wie folgt sichtbar/anklickbar ist :

    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();
    
  • Bei permanentem Overlay verwenden Sie executeScript() Methode von JavascriptExecutor Schnittstelle wie folgt:

    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);
    

    Eine ausführliche Beschreibung finden Sie unter Verwenden von JS zur Texteingabe. Wenn ich jedoch Text in ein Textfeld eingebe, wird der bereits eingegebene Wert gelöscht.

  • Wenn Attribute vorhanden sind, z. class="ng-hide", style="display: none", etc benutze executeScript() Methode von JavascriptExecutor Interface zum Bearbeiten und Zurücksetzen des style="display: none" Attributs auf style="display: block" wie folgt:

    import org.openqa.Selenium.JavascriptExecutor;
    ((JavascriptExecutor) driver).executeScript("document.getElementById('ID').style.display='block';");
    

    Eine ausführliche Diskussion finden Sie in Kann das Element Versteckter Textbereich nicht ausfüllen

Verweise


Dieses besondere Problem

Wenn Sie sich die [~ # ~] html [~ # ~] der Facebook Anmeldeseite ansehen, enthält die Anwendung Reagiere Native Elemente. Ein Element, das in Ihrem System einmal mit id als u_0_b dargestellt wurde, wird möglicherweise nicht mit dem gleichen id wie u_0_b im nächsten Lauf auf Ihrem System. Daher müssen wir uns der Dynamic Locator Strategy annehmen. Sie können den folgenden Codeblock verwenden, um die beabsichtigten Schritte auszuführen:

  • 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:

    FacebookRegistration


Aktualisieren

Fehler beheben:

org.openqa.Selenium.ElementNotInteractableException: Element is not reachable by keyboard

Mit der Verfügbarkeit von Firefox-Funktionen ist es einfacher geworden. moz: webdriverClick

moz: webdriverClick ()

Mit webdriverClick() können Sie einen Booleschen Wert übergeben, um anzugeben, welche Art von Interaktionsprüfungen ausgeführt werden sollen, wenn ein Klick ausgeführt oder Schlüssel an ein Element gesendet werden . Für Firefoxen vor v58.0 einigen älteren Code, der aus einer älteren Version von FirefoxDriver wurde verwendet. Mit der Verfügbarkeit von Firefox v58 sind die Interaktionsprüfungen gemäß der WebDriver-Spezifikation standardmäßig aktiviert. Dies bedeutet, dass der Geckodriver beim Klicken zusätzlich prüft, ob ein Element von einem anderen verdeckt wird und ob ein Element zum Senden von Schlüsseln fokussiert werden kann. Aufgrund dieser Verhaltensänderung sind wir uns bewusst, dass einige zusätzliche Fehler zurückgegeben werden können. In den meisten Fällen muss der betreffende Test möglicherweise aktualisiert werden, damit er den neuen Prüfungen entspricht.

Um die WebDriver-konformen Prüfungen vorübergehend zu deaktivieren, verwenden Sie false als Wert für diese Funktion.

Hinweis : Diese Funktion ist nur vorübergehend verfügbar und wird entfernt, sobald die Interaktionsprüfungen stabilisiert wurden.

19
DebanjanB

Sie können diesen Code ausprobieren

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);
        }
}  

probieren Sie diesen Code aus und teilen Sie mir den Status mit.

0
cruisepandey

In einem der Anwendungsfälle hatte ich das gleiche Problem:

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

verwenden von ID zum Identifizieren eines Elements vor dem Senden von Schlüsseln. So etwas wie:

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

Nach dem Testen habe ich zu CSS Selector gewechselt und das Problem behoben:

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

Daher empfehle ich dringend, verschiedene Methoden für die Interaktion mit den Elementen zu verwenden, da Sie durch etwas anderes Zeit sparen können, wenn Sie Probleme lösen.

0
invzbl3