Огурец не может найти элемент — первый сценарий проходит, а последующие завершаются неудачно

#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. мои извинения, я был идиотом, используя неправильный селектор элементов. Спасибо за помощь, хотя