2017-06-30 1 views
0

Ich verwende Selenide, um ein Beispieleingabeformular auf w3schools.com (gefunden here) zu öffnen.Selenide-Test nicht in der Lage, korrektes Element auf einer neu geöffneten Registerkarte/Fenster zu laden

Der Test gibt einen Namen in das Formular ein und klickt auf submit, wodurch eine neue Seite in einem separaten Tab/Fenster geöffnet wird, in dem die Anfrageparameter in einem div angezeigt werden.

Sample HTML form screenshot

Returned results screenshot

Das folgende ist mein Testcode:

import com.codeborne.selenide.Configuration 
import org.openqa.grid.internal.utils.configuration.StandaloneConfiguration 
import org.openqa.selenium.remote.server.SeleniumServer 
import spock.lang.Specification 

import static com.codeborne.selenide.Condition.* 
import static com.codeborne.selenide.Selectors.byName 
import static com.codeborne.selenide.Selectors.byTitle 
import static com.codeborne.selenide.Selenide.* 

class DummyTest extends Specification { 

    def "Test w3schools form submit"() { 
     given: "Server setup configurations" 
      Configuration.browser = 'chrome' 
      StandaloneConfiguration configuration = new StandaloneConfiguration() 
      SeleniumServer server = new SeleniumServer(configuration) 
      server.boot() 

     when: "Name info is submitted into the form" 
      open("http://www.w3schools.com/html/html_forms.asp") 
      $(byName("firstname")).setValue("Clark") 
      $(byName("lastname")).setValue("Kent") 
      $x('//*[@id="main"]/div[3]/div/form/input[3]').click() 

      // Maybe this will fix the erroneous element problem? 
      $(byTitle('HTML Forms')).waitUntil(disappears, 5000) 

     then: "New page should display the passed-in request params" 
      $x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent")) 
    } 
} 

... wo webdriver.chrome.driver an die richtige Stelle von chromedriver.exe eine bestandene-in-Umgebungsvariable Zeige ist.

Der Test öffnet die erste Formularseite und gibt den Vor-/Nachnamen korrekt ein. Wenn er auf die Schaltfläche Senden klickt, wartet er auf die zweite Seite, um die Anforderungs-Parameter zu laden und anzuzeigen.

Als eine Anmerkung, tritt der Fehler unabhängig davon auf, ob mein waitUntil() Methodenaufruf vorhanden ist oder nicht. Viele der anderen StackOverflow-Einträge schlagen vor, so etwas zu tun, um das Problem zu beheben, obwohl die Selenide-Dokumente sagen, dass der shouldHave()-Aufruf in meiner then-Klausel automatisch eine fließende Wartezeit einleiten sollte.

Dies ist die Ausgabe meines Testfalls:

Condition failed with Exception: 

$x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent")) 
|      |   | 
|      |   text 'firstname=Clark&lastname=Kent' 
|      Element should have text 'firstname=Clark&lastname=Kent' {By.xpath: /html/body/div[1]} 
|      Element: '<div class="w3-container top">w3schools.com 
|      THE WORLD'S LARGEST WEB DEVELOPER SITE</div>' 
|      Screenshot: file:/C:/Workspace/IntelliJ/dummy-selenide-project/build/reports/tests/1498836183270.0.png 
|      Timeout: 4 s. 
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]"} 

Also, es ist klar, dass, gemäß dem Testausgang, es ist die xPath der ursprünglichen Seite greifen, nicht die zweiten Seite.

Gibt es etwas, das ich vermisse oder falsch mache? Muss ich ein neues Objekt oder etwas für jede neue Seite instanziieren?

Antwort

0

Es war schwierig, die Antwort in den Dokumenten zu finden, aber ich habe in einer Frage here herausgefunden, dass Sie eine Methode aufrufen müssen, um zu einem anderen Fenster zu wechseln.

Sie müssen die statische Methode Selenide#switchTo() aufrufen, die eine SelenideTargetLocator zurückgibt. Auf diesem Objekt können Sie die Methode window() aufrufen, die entweder einen 0-basierten Index (int) oder einen Namen/Handle/Titel (String) annimmt.

Also, nach dem Hinzufügen des switchTo() Methode in meiner and Klausel für mein Spock Test, sieht das Arbeitsergebnis wie folgt aus:

def "Test w3schools form submit"() { 
    given: "Server setup configurations" 
     Configuration.browser = 'chrome' 
     StandaloneConfiguration configuration = new StandaloneConfiguration() 
     SeleniumServer server = new SeleniumServer(configuration) 
     server.boot() 

    when: "Name info is submitted into the form" 
     open("http://www.w3schools.com/html/html_forms.asp") 
     $(byName("firstname")).setValue("Clark") 
     $(byName("lastname")).setValue("Kent") 
     $x('//*[@id="main"]/div[3]/div/form/input[3]').click() 

    and: "Switch to newly opened window" 
     switchTo().window(1) 

    then: "New page should display the passed-in request params" 
     $x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent")) 
} 

Hinweis: Aus Gründen der mein Testcode, da nur der Test öffnet Ein neuer Tab, der die Nummer switchTo(1) aufruft, funktioniert hier in Chrome. Beachten Sie jedoch, dass sich die Reihenfolge der Fenster/Tabs in anderen Browsern unterscheiden kann.

Verwandte Themen