it-swarm.com.de

Die Click () - Methode funktioniert nicht immer

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(); 
}
22
user1494328

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:

  1. HTML-Inhalte werden mit deaktivierter Schaltfläche dargestellt.
  2. Das Selenium-Web-Treiberskript wurde ausgeführt, bevor das JavaScript onload -Ereignis ausgelöst wurde (oder die Ausführung wurde beendet). Der button.click würde also bei einem deaktivierten Element vorkommen. Und nichts würde passieren.
  3. Dann würde das Javascript-Onload-Ereignis auslösen (oder die Ausführung beenden), und das Javascript würde die Schaltfläche aktivieren.
  4. Ich schaute auf die Seite und konnte nicht herausfinden, warum mein Code nicht funktionierte, da die Schaltfläche bei der Überprüfung aktiviert zu sein schien. Wenn ich die Schaltfläche manuell anklickte, funktionierte sie.

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
20
Walker D

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

Oft geschieht dies aufgrund von Browserkompatibilität (meistens auf Firefox). Verwenden Sie also "WebElement.sendKeys (Keys.ENTER);" code statt "webElement.click ();"

3
Rakesh Gajarmal

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();
2
loother

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 ...

  • Das Problem ist nicht, dass das Element gefunden wird und das Javascript nicht ausgelöst wird. Sie können versuchen, Javascript-Code direkt auszuführen und die Ereignisse manuell auszulösen. Sie sehen, dass dies nicht funktioniert.
  • Dieses Problem tritt bei Firefox 22 auf und funktioniert wahrscheinlich für ältere Versionen dieses Browsers. Ich kann keine Informationen liefern, wenn dies unter IE oder Chrome funktioniert. Das Problem selbst ist, dass selbst wenn es einen Syntaxkonflikt auf xpath firefox gibt, keine Ausnahme ausgelöst wird. Das lässt Sie denken, dass mit Ihrem Code nichts falsch ist, aber das ist der Fall.
  • Dies ist ein unerwartetes, nicht behandeltes Verhalten für Firefox. Ich habe dafür einen Fehler gefunden: http://code.google.com/p/Selenium/issues/detail?id=4757

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.

0
Romita Dinda

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();
0
Jitesh Lakhwani

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 ...

0
Vinay