Selenide+Spock, один класс на страницу - при переходе на страницу открывается новое окно

Я новичок как в Spock, так и в Selenide, поэтому прошу прощения, если это что-то очевидно, но я не смог найти ответ в Google. Я пытаюсь написать простой тест для сайта Jenkins (тестовая машина имеет доступ только к локальным ресурсам, поэтому я не могу привести пример Google, но должно быть примерно так же).

Он открывает сайт, вводит слово в поле поиска, нажимает Enter, а затем проверяет результаты поиска на соответствие.

Есть три класса: 1. JenkinsTest — где тест написан в нотации Спока. 2. JenkinsPage — отвечает за ввод теста в поле поиска и нажатие Enter. 3. SearchResultsPage — отвечает за проверку результатов поиска.

Проблема в том, что SearchResultsPage, похоже, открывает собственное окно браузера вместо того, чтобы смотреть в существующее. Поэтому, когда я смотрю на $("body") этого класса, я получаю "Это начальная страница для сервера WebDriver". Есть ли способ иметь класс на странице, и при этом все они подключены к одному и тому же окну браузера? В настоящее время JenkinsPage использует то же окно, которое было открыто изначально, но SearchResultsPage открывает новое окно браузера, которое закрывается через секунду.

JenkinsTest.groovy:

package sandbox-test;

import org.junit.Test;    
import static com.codeborne.selenide.CollectionCondition.sizeGreaterThan;
import static com.codeborne.selenide.Condition.text;
import static com.codeborne.selenide.Selenide.open;    
import org.openqa.selenium.chrome.ChromeOptions;
import spock.lang.*

class JenkinsTest extends spock.lang.Specification {    
    public void "Can search for assure"() {
        setup:
            open("http://local.hostname.com/jenkins/")          
        when:
            new JenkinsPage().searchFor("test")
            SearchResultsPage results = new SearchResultsPage()    
        then:
            results.getResults() == "testresults"               
    }
}

JenkinsPage.groovy:

package sandbox-test;

import org.openqa.selenium.By;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.page;

class JenkinsPage {
  def searchFor(String text) {
    $(By.name("q")).val(text).pressEnter()
  }
}

SearchResultsPage.groovy:

package sandbox-test;

import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.SelenideElement;    
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.$$;

class SearchResultsPage {
  public ElementsCollection getResults() {
    return $("body")
  }
  public SelenideElement getResult(int index) {
    return $("#main-panel li", index)
  }
}

person hali17    schedule 20.11.2018    source источник


Ответы (1)


В итоге заработало.

В JenkinsTest использовалась эта строка для блока «тогда»:

results.getResult().getText().contains("assure-integration-ofm")
results.getResults().first().text == "assure-integration-ofm"

И переписал SearchResultsPage.groovy как:

package sandbox-test;

import org.openqa.selenium.By;
import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;

class SearchResultsPage {
  public ElementsCollection getResults() {
    ElementsCollection list = Selenide.$$(By.xpath("//ol/li"))
    return list
  }
  public SelenideElement getResult() {
    SelenideElement list = Selenide.$(By.xpath("//ol"))
    return list
  }
}

Я до сих пор не понимаю, почему не работал оригинал, ведь я взял его из примеров Селенида и лишь немного изменил. Но да ладно.

person hali17    schedule 20.11.2018