Ich habe ein Problem mit meinen Tests in Selenium WebDriver. Das Click
-Ereignis funktioniert nicht immer, wenn ein Programm versucht, auf die Schaltfläche zu klicken. In einem Test ist alles in Ordnung, in anderen nicht.
Jeder Test beginnt auf einer Seite. Zuerst muss der Benutzer eine Option aus einer select
-Komponente auswählen und danach klickt der Benutzer auf eine Schaltfläche.
Ich möchte wissen, warum einmal alles in Ordnung ist und wenn ich ein zweites Mal Tests durchführe, dann nicht?
Hier ist der Quellcode zum Suchen und Klicken auf die Schaltfläche:
public void clickContinueBtn() {
webElement = driver.findElement(By.xpath("//div[@class='btn Magenta_s']/a/span"));
webElement.click();
}
Ich bin auf eine ähnliche Ausgabe gestoßen. Die Klickmethode funktionierte auf anderen Seiten und funktionierte auf einer bestimmten Seite überhaupt nicht.
Eine Racebedingung verursachte das Problem:
button.click
würde also bei einem deaktivierten Element vorkommen. Und nichts würde passieren.Als ich herausfand, dass es sich um ein Timing-Problem handelte, fand ich die Lösung hier: Wie kann ich Selenium Web Driver dazu bringen, auf ein Element zu warten, das nicht nur präsent ist?
So formulieren Sie die Lösung in Ruby:
//This will not return the button until it is enabled.
button = driver.find_element(:xpath, "//button[@id='myButtonId' and not(@disabled)]")
button.click
Sie können auch die Javascript-basierte alternative Methode zum Klicken verwenden. Der Code dafür kann wie folgt aussehen:
WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
Oft geschieht dies aufgrund von Browserkompatibilität (meistens auf Firefox). Verwenden Sie also "WebElement.sendKeys (Keys.ENTER);" code statt "webElement.click ();"
Haben Sie sichergestellt, dass es keine zeitlichen Probleme gibt? Legen Sie einen Haltepunkt fest, bevor Sie das Element finden, und prüfen Sie, ob der Code ordnungsgemäß ausgeführt wird. Wenn es ein Zeitproblem gibt, verwenden Sie ein explizites Warten, bevor Sie auf Ihre Schaltfläche klicken. Beachten Sie auch, dass die Schaltfläche anklickbar sein muss (das Element muss sichtbar UND aktiviert sein), bevor Sie darauf klicken.
eine Lösung mit explizitem Warten könnte so aussehen:
By by = By.xpath("//div[@class='btn Magenta_s']/a/span");
WebDriverWait w = new WebDriverWait(driver, timeout);
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by);
element.click();
Ich hatte vor ein paar Tagen ein ähnliches Problem und fand die Lösung in meinem speziellen Fall. === Mit dem Selenium Webdriver wollte ich auf den Link "First Link" klicken und der Inhalt der Seite wird geladen.
Nachfolgend ein Teil des Codes mit Struktur wie in meinem Fall:
<li class="first-link">
<a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a>
</li>
=== Das Ergebnis ist, dass das Webelement gefunden und angeklickt werden soll. Wenn Sie jedoch zur Benutzeroberfläche wechseln, ist nichts passiert, es wurde auch kein Fehler ausgegeben (Element nicht gefunden, Element nicht bereit zum Klicken, Element deaktiviert, usw.).
Nachdem ich versucht hatte, den Link auf verschiedene Weise zu finden (xpath und css, habe es nicht mit der ID versucht, da es in meinem Fall keine eindeutige ID gibt), konnte ich auf das Element mit dem Selenium Webdriver von css und dem folgenden Wert zugreifen : li.first-link a
. Als ich jedoch versuchte, über xpath mit dem folgenden Wert darauf zuzugreifen, wurde dies in Firefox "gefunden", aber der Klick funktionierte nicht: .//li[a/text()='First Link']
.
Das Problem war ein leichtes Problem mit der Xpath-Syntax, das Firebug von Firefox überhaupt nicht meldete, tatsächlich fand es den Link.
Ich habe die Reihenfolge der geschweiften Klammern folgendermaßen geändert: .//li/a[text()='First Link']
Jetzt funktioniert es wie erwartet, der erste Link wird gefunden und angeklickt und der Javascript-Code, der die Seite lädt, wird ausgelöst.
Meine Feststellungen sind: * Dies ist kein Zeitproblem, daher geschieht dies nicht, weil Sie versuchen, auf ein Element zu klicken, das nicht fertig ist. Ansonsten hatten wir das mit einem expliziten Selenium-Warten gelöst ...
LÖSUNG VORGESCHLAGEN: Überprüfen Sie Ihre HTML-Struktur, Ihren Xpath, versuchen Sie, Probleme in der Syntax zu finden, und finden Sie verschiedene Möglichkeiten, um auf das Element zuzugreifen.
Versuchen Sie es mit dem folgenden Code: Manchmal haben Sie Ihren Fokus absichtlich auf Ihre Elemente gerichtet
WebElement element = driver.findElement("yourElement");
Actions builder = new Actions(driver);
builder.moveToElement(element).click(element);
builder.perform();
Wenn Sie Ihren xpath betrachten, haben Sie die Schaltfläche nicht erkannt, stattdessen zeigen Sie auf das span-Tag, in dem sich die Schaltfläche befindet. Selen klickt auf die Spannweite anstelle der Schaltfläche. Deshalb funktioniert click () nicht. Bitte verwenden Sie eine ID oder einen Namen, falls verfügbar, oder ändern Sie den X-Pfad, um auch den Button-Tag einzuschließen. Wenn Sie die HTML-Datei veröffentlichen können, ist es einfach, den X-Pfad zu erstellen. click () hat perfekt für mich funktioniert und ich benutze diese Methode seit über einem Jahr in einem Projekt und jedes Mal, wenn es gut funktioniert ...