У меня есть настройка Selenium на основе Java, которая использует Cucumber для определения и запуска тестов. В настоящее время это выполняется с использованием драйвера Chrome, но в идеале мы должны повторить тесты с использованием Firefox и IE (и, если возможно, параллельно), поскольку локальные пользователи используют все три. Я использую Gradle в качестве инструмента для сборки и хотел бы придерживаться этого.
Чтобы попытаться применить этот подход, я реализовал установку параллельного тестирования на основе JUnit, которая описана здесь , которая прекрасно работает и выполняет именно то, что я хочу. ОДНАКО, это не проходит через Cucumber, а напрямую в JUnit, и я не могу найти простой способ его адаптации.
Я нашел Цуккини , который, кажется, делает именно то, что я хочу. ОДНАКО документация по этому вопросу очень скудна, и с моим ограниченным опытом я не могу ее настроить - я новичок в тестировании, Selenium и Java и унаследовал эту среду, которую я пытаюсь расширить. Вот пример здесь , который почти работает для меня (не работает в Firefox, но это, скорее всего, мои настройки), но я не могу его реализовать. В основном в моей реализации код запускается, открывает драйвер и, кажется, немедленно закрывает его снова. Затем он возвращает исключение NullPointerException на первом этапе сценария (предположительно, так как он не может найти драйвер).
Мой файл функций:
Feature: Visit Google and do an example search
Scenario: Navigate to the Google search homepage, search for "Cat", and check the first result is about cats
Given I visit the Google search page
When I enter the text "cat" into the search box
And I click the search button
Then I should see the top result mentioning cats
Мой установочный код (аналогично FirstZucchiniTest.java
в примере репозитория):
package stepDefinitions;
import java.util.ArrayList;
import java.util.List;
import com.comcast.zucchini.AbstractZucchiniTest;
import com.comcast.zucchini.TestContext;
import net.dimaj.zucchini.utils.Constants;
import cucumber.api.CucumberOptions;
import cucumber.api.Scenario;
import cucumber.api.java.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
@CucumberOptions(
features = {"src/test/resources/features"},
plugin = {"pretty", "json:target/cucumber-report/json/cucumber-report.json", "html:target/cucumber-report"},
glue={"helpers","stepDefinitions"}
)
public class ZucchiniDefinitions extends AbstractZucchiniTest {
@Override
public List<TestContext> getTestContexts() {
List<TestContext> rv = new ArrayList<TestContext>();
TestContext chrome = new TestContext("chrome");
chrome.set(Constants.CONTEXT_BROWSER, new ChromeDriver());
rv.add(chrome);
TestContext ff = new TestContext("firefox");
ff.set(Constants.CONTEXT_BROWSER, new FirefoxDriver());
rv.add(ff);
return rv;
}
@Override
public void cleanup(TestContext out) {
WebDriver driver = out.get(Constants.CONTEXT_BROWSER);
if (null != driver) {
driver.quit();
}
}
}
Определения для посещения Google:
package stepDefinitions;
import com.comcast.zucchini.TestContext;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import org.openqa.selenium.WebDriver;
import pageFactory.examplePages.GoogleSearchHomepage;
import pageFactory.examplePages.GoogleSearchResultsPage;
import static net.dimaj.zucchini.utils.Constants.CONTEXT_BROWSER;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
public class GoogleDefinitions {
private WebDriver driver;
public GoogleDefinitions (BaseDefinitions baseDefinitions) {
this.driver = TestContext.getCurrent().get(CONTEXT_BROWSER);
System.out.println("got driver");
}
@Given("^I visit the Google search page$")
public void iVisitTheGoogleSearchPage() {
GoogleSearchHomepage googleSearchHomepage = new GoogleSearchHomepage(driver);
googleSearchHomepage.visit();
}
@When("^I enter the text \"([^\"]*)\" into the search box$")
public void iEnterTheTextIntoTheSearchBox(String textToEnter) {
GoogleSearchHomepage googleSearchHomepage = new GoogleSearchHomepage(driver);
googleSearchHomepage.typeInSearchField(textToEnter);
}
@And("^I click the search button$")
public void iClickTheSearchButton() {
GoogleSearchHomepage googleSearchHomepage = new GoogleSearchHomepage(driver);
googleSearchHomepage.clickSearchButton();
}
@Then("^I should see the top result mentioning cats$")
public void iShouldSeeTheTopResultMentioningCats() {
GoogleSearchResultsPage googleSearchResultsPage = new GoogleSearchResultsPage(driver);
assertThat(googleSearchResultsPage.getTextOfResult(1).toLowerCase(), containsString("cat"));
}
}
И, наконец, определения страниц для главной страницы Google:
package pageFactory.examplePages;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import pageFactory.SuperPage;
public class GoogleSearchHomepage extends SuperPage {
@FindBy(css = ".gsfi[name='q']")
public WebElement searchTextField;
@FindBy(css = "[value='Google Search'][name='btnK']")
public WebElement searchButton;
public GoogleSearchHomepage(WebDriver driver) {
super(driver);
}
public void typeInSearchField(String text) {
searchTextField.sendKeys(text);
}
public GoogleSearchResultsPage clickSearchButton() {
searchTextField.sendKeys(Keys.RETURN);
return new GoogleSearchResultsPage(driver);
}
public GoogleSearchHomepage visit() {
driver.get("https://www.google.co.uk/");
System.out.println("Google acquired");
return new GoogleSearchHomepage(driver);
}
}
и страница результатов поиска Google:
package pageFactory.examplePages;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import pageFactory.SuperPage;
import java.util.List;
public class GoogleSearchResultsPage extends SuperPage {
@FindBy(className = "r:first-of-type")
public List<WebElement> searchTextField;
public GoogleSearchResultsPage(WebDriver driver) {
super(driver);
}
public String getTextOfResult(Integer resultNumberToGet) {
return searchTextField.get(resultNumberToGet).getText();
}
}
Константы соответствуют исходному репозиторию и выглядят следующим образом:
package net.dimaj.zucchini.utils;
public class Constants {
public static final String CONTEXT_BROWSER = "browser";
public static final String CONTEXT_SCENARIO = "scenarior";
}
У меня вопрос, почему эта настройка не работает?