#selenium #selenium-webdriver #cucumber
#селен #selenium-webdriver #огурец
Вопрос:
Я запускаю тесты cucumber с помощью selenium / TestNG и сообщаю через html. Первый сценарий проходит нормально, но последующие завершаются неудачно, когда они должны проходить, из-за невозможности найти элемент. Второй сценарий (тот, в котором произошел сбой) почти идентичен первому, он просто проверяет, отображается ли другой элемент на странице, что, безусловно, так и есть. Вот как выглядит мой файл функций:
Feature: LoginFeature
This deals with logging in
Scenario: Log in with correct username
Given I navigate to the login page
And I enter the following login details:
| username | password |
| cukey | passwoid |
And I click the login button
Then I should land on the newest page
Scenario: Log in with correct username part 2
Given I navigate to the login page
And I enter the following login details:
| username | password |
| cukey | passwoid |
And I click the login button
Then I should land on the newest page by other measure
Scenario: Log in with correct username to fail
Given I navigate to the login page
And I enter the following login details:
| username | password |
| cukey | passwoid |
And I click the login button
Then I should land on the newest page wrongly
Вот мои определения / реализации шагов (@then с «средним именем» — это тот, который должен проходить):
package Steps;
import Base.BaseUtil;
import Pages.LoginPageObjeks;
//import cucumber.api.DataTable;
import io.cucumber.datatable.DataTable;
import cucumber.api.PendingException;
import cucumber.api.java.en.And;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.List;
public class MaStepdefs extends BaseUtil {
private BaseUtil base;
public MaStepdefs(BaseUtil base) {
this.base = base;
}
@And("^I click the login button$")
public void iClickTheLoginButton() throws Throwable {
LoginPageObjeks page = new LoginPageObjeks(base.Driver);
page.ClickLogin();
}
@Given("^I navigate to the login page$")
public void iNavigateToTheLoginPage() throws Throwable {
base.Driver.navigate().to("http://www.executeautomation.com/demosite/Login.html");
}
@And("^I enter the following login details:$")
public void iEnterTheFollowingLoginDetails(DataTable table) throws Throwable {
List<List<String>> data = table.asLists(String.class);
String userName = data.get(1).get(1);
String passWord = data.get(1).get(0);
List<User> users = new ArrayList();
users.add(new User(userName, passWord));
LoginPageObjeks page = new LoginPageObjeks(base.Driver);
for (User user : users)
page.Login(user.username, user.password);
//List<User> users = new ArrayList<User>();
//users = table.asList(User.class);
Thread.sleep(2000);
}
@Then("^I should land on the newest page$")
public void iShouldLandOnTheNewestPage () throws Throwable {
Assert.assertEquals("It's not displayed", base.Driver.findElement(By.id("Initial")).isDisplayed(), true);
}
@Then("^I should land on the newest page wrongly$")
public void iShouldLandOnTheNewestPageWrongly() throws Throwable {
Assert.assertEquals("It's not displayed", base.Driver.findElement(By.id("fish")).isDisplayed(), true);
}
@Then("^I should land on the newest page by other measure$")
public void iShouldLandOnTheNewestPageByOtherMeasure() throws Throwable {
Assert.assertEquals("It's not displayed", base.Driver.findElement(By.id("Middle Name")).isDisplayed(), true);
}
}
class User {
public String username;
public String password;
public User(String userName, String passWord) {
username = userName;
password = passWord;
}
}
И вот мой тестовый бегун:
package Runner;
import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;
import org.junit.runner.RunWith;
import cucumber.api.junit.Cucumber;
//@RunWith(Cucumber.class)
@CucumberOptions(features = {"src/test/java/features"}, plugin = {"json:target/cucumber.json", "html:target/site/cucumber-pretty"}, glue = "Steps")
public class TestRunner extends AbstractTestNGCucumberTests {
}
Кто-нибудь знает, что может быть причиной этого? Есть ли что-то, что мне нужно добавить для TestNG для запуска нескольких сценариев? Любая помощь будет оценена, спасибо
Комментарии:
1. Первые три шага для всех сценариев идентичны, но они имеют разные ожидаемые результаты? Поскольку вы вошли в систему одинаково все три раза, я не понимаю, почему тест будет ожидать другую целевую страницу.
2. Если вы повторно используете одни и те же первые шаги всех сценариев в одном файле функций, рассмотрите возможность использования background (google, это хорошо документировано, «Cucumber — background») другое дело, придерживайтесь своих тестовых сценариев, ваши сценарии должны в идеальном мире тестировать ЕДИНУЮ функциональность, вместо этого было бы лучшечтобы создать один сценарий, который тестирует процесс входа в систему, один сценарий, который проверяет, что вы не сможете войти в систему с неверными данными и т. Д.
3. Они не идентичны. Второй проверяет, отображается ли на странице другой элемент (который есть и должен пройти), а третий тот же, но проверяет элемент, которого там нет — он предназначен для сбоя. Я попробую использовать Background, но я все еще не понимаю, почему это не сработает таким образом
4. мои извинения, я был идиотом, используя неправильный селектор элементов. Спасибо за помощь, хотя