Selenide + Spock, один класс на страницу - переход на страницу, кажется, открывает новое окно - PullRequest
0 голосов
/ 20 ноября 2018

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

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

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

Проблема в том, что SearchResultsPage, похоже, открывает свое собственное окно браузера вместо просмотра существующего. Поэтому, когда я смотрю на $ («тело») из этого класса, я получаю «Это начальная стартовая страница для сервера 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)
  }
}

1 Ответ

0 голосов
/ 20 ноября 2018

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

В JenkinsTest использовали эту строку для блока "then":

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

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

...