Selenium InternetExplorerDriver erhält keinen Fokus auf das Fenster

Lesezeit: 3 Minuten

Selenium InternetExplorerDriver erhalt keinen Fokus auf das Fenster
Jair

Mein Projekt umfasst Selenium Webdriver, JAVA, Maven, TestNG, Jenkins, Allure (Berichte). Ich habe ein paar Testsuiten mit über 100 Testfällen und iteriere sie durch 3 verschiedene Browser (die Tests laufen parallel mit TestNG).

Es gibt einen Test, der nicht bestanden werden kann, es sei denn, ich beobachte tatsächlich das Fenster und sehe den Testlauf.

Ich werde erklären: was versuche ich zu testen? Unsere JS-Entwickler haben eine Funktion erstellt, die nur dann, wenn der Benutzer den Fokus auf das Fenster hat, eine Bild-Diashow beginnt, sich zu bewegen und Bilder zu ändern.

Auf Firefox und Chrome hat es super bestanden – ich muss den Test nicht sehen. Der Fokus kann auf anderen Registerkarten oder Browsern liegen, und der Treiber emuliert alles. Auf IEdriver ist es nicht so!!

Ich habe versucht, dem Treiber viele Funktionen hinzuzufügen, aber immer noch nichts (einige davon haben mich bei einigen anderen Problemen gelöst):

}else if (browser.equalsIgnoreCase("ie")) {

    String exeServiceIEdriver = Consts.ieDriverPath;
    System.setProperty("webdriver.ie.driver", exeServiceIEdriver);
      DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
      ieCapabilities.setCapability("nativeEvents", false);
      ieCapabilities.setCapability("unexpectedAlertBehaviour", "accept");
      ieCapabilities.setCapability("ignoreProtectedModeSettings", true);
      ieCapabilities.setCapability("disable-popup-blocking", true);
      ieCapabilities.setCapability("enablePersistentHover", true);
      ieCapabilities.setCapability("ignoreZoomSetting", true);
        //ieCapabilities.setCapability("version", "12"); does it work?? don't think so..
      ieCapabilities.setCapability("requireWindowFocus", true);
        //ieCapabilities.setCapability("browser_version", "9.0");  // Does NOT work. need user agent
      ieCapabilities.setCapability("IE_ENSURE_CLEAN_SESSION", true);  // Does NOT work. need user agent
      ieCapabilities.setCapability("browserAttachTimeout",5000);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.SUPPORTS_APPLICATION_CACHE,false);

    driver = new InternetExplorerDriver(ieCapabilities);
    Log.info("\n*** Starting IE Browser ***");

Selenium InternetExplorerDriver erhalt keinen Fokus auf das Fenster
unentdecktes Selen

Anscheinend haben Sie sich entschieden, alle hinzuzufügen InternetExplorerDriver verwandte Fähigkeiten.

Browser Focus

Die Herausforderung besteht darin, dass der IE selbst die Windows-Meldungen, die wir an das IE-Browserfenster senden (WM_MOUSEDOWN und WM_MOUSEUP), wenn das Fenster nicht den Fokus hat. Insbesondere das Element, auf das geklickt wird, erhält ein Fokusfenster um es herum, aber der Klick wird nicht von dem Element verarbeitet. Wir sollten wohl überhaupt keine Nachrichten senden; vielmehr sollten wir die verwenden SendInput() API, aber diese API erfordert explizit, dass das Fenster den Fokus hat. Wir haben zwei widersprüchliche Ziele mit der WebDriver Projekt.

Daher bemühen wir uns zunächst, den Benutzer so genau wie möglich zu emulieren. Dies bedeutet, dass native Ereignisse verwendet werden, anstatt die Ereignisse zu simulieren JavaScript.

Zweitens möchten wir nicht, dass der Fokus des Browserfensters automatisiert wird. Das bedeutet, dass es suboptimal ist, das Browserfenster nur in den Vordergrund zu zwingen.

Eine zusätzliche Überlegung ist die Möglichkeit, dass mehrere IE-Instanzen unter mehreren ausgeführt werden WebDriver Instanzen, das heißt jede solche bring the window to the foreground Lösung muss in eine Art Synchronisierungskonstrukt verpackt werden (wahrscheinlich a mutex) im C++-Code des IE-Treibers. Trotzdem unterliegt dieser Code immer noch Rennbedingungen, wenn der Benutzer beispielsweise ein anderes Fenster in den Vordergrund bringt, während der Treiber den IE in den Vordergrund bringt und das native Ereignis ausführt.

Die Diskussion um die Anforderungen an den Fahrer und die Priorisierung dieser beiden widersprüchlichen Ziele dauert an. Die derzeit vorherrschende Meinung ist, Ersteres gegenüber Letzterem zu priorisieren und zu dokumentieren, dass Ihr Computer für andere Aufgaben nicht verfügbar ist, wenn Sie den IE-Treiber verwenden. Diese Entscheidung ist jedoch noch lange nicht abgeschlossen, und der Code zu ihrer Implementierung wird wahrscheinlich ziemlich kompliziert sein.

Lösung

Als Zwischenlösung können Sie die Funktion hinzufügen:

ieCapabilities.setCapability("requireWindowFocus", false);

  • Wenn Sie etwas zitieren, stellen Sie sicher, dass Sie das richtige Markdown-Symbol > verwenden, um anzuzeigen, dass Sie zitieren.

    – JeffC

    7. August 2018 um 13:47 Uhr

  • Danke @DebanjanB, es funktioniert! Ich hatte diese Fähigkeit bereits, aber sie war auf “true” gesetzt (nicht sicher warum). Ich hoffe, es bringt meine anderen Tests (Klicks usw.) nicht durcheinander.

    – Jair

    7. August 2018 um 18:07 Uhr

996060cookie-checkSelenium InternetExplorerDriver erhält keinen Fokus auf das Fenster

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy