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();
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.
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:
hidden
-Attribut konnte auf eine der folgenden Arten implementiert werden: class="ng-hide"
, style="display: none"
, uswclick()
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 .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
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:
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
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.
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.
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.