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