Передача параметров в таблицах данных Selenium/Cucumber/Java

Я использую модель POM и использую Cucumber для моей автоматизации.

Я пытаюсь реализовать негативный сценарий для входа в систему, и я использовал следующую стратегию.

Мне нужно знать, правильный ли это подход, или я где-то все испортил.

Я использую xpath для подтверждения входа в систему.

login.feature

    Given User navigates to Site
    And User enters a "<Username>" username
    And User enters a "<Password>" password
    When User clicks on the login button
    Then User should see the failure "<message>"

    Examples:
      | Username | Password   | message|
      | User | Pwd  | //DIV[@class=''][text()='Your login name or password is incorrect.']/../..] |

login.steps

    @Then("^User should see the failure \"([^\"]*)\"$")
    public void user_should_see_the_failure(String arg1 ) throws Throwable {
login_page.assertLoginFailure(arg1);
    }


login.page

    public @FindBy(xpath = "//DIV[@class=''][text()='Your login name or password is incorrect.']/../..")
    WebElement assert_LoginFailure;


    public login_page assertLoginFailure(String arg1) throws Exception {
        Thread.sleep(5000);
        org.testng.Assert.assertEquals(assert_LoginFailure,arg1);
        return new login_page();


    }

2 ответа

Решение

Значение под сообщением в DataTable должен быть простым текстом, ожидаемым при неудачном входе в систему. В идеале не должно включать xpath или любой селектор.

Селектор должен быть определен в объекте страницы. Также селектор должен быть изменен, чтобы не включать сам текст.

Таким образом, когда тест не пройден, вместо получения AssertionError вы получите NoSuchElementException, Невозможно определить, не прошел ли тест из-за того, что недействительные учетные данные оказались действительными или сообщение было изменено на сайте.

Thread.sleep() отчасти осуждается. Скорее посмотрите на неявное или явное ожидание. Обратитесь к этому - http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/

Это ваше утверждение:

org.testng.Assert.assertEquals(assert_LoginFailure,arg1);  

где assert_LoginFailure - веб-элемент, а arg1 - строка. Теперь нет смысла сравнивать строку с веб-элементом, не так ли?

Вы должны извлечь текст, присутствующий в веб-элементе, что-то вроде:

assert_LoginFailure.getText()  

Ваше утверждение будет выглядеть так:

org.testng.Assert.assertEquals(assert_LoginFailure.getText(),arg1);  

Надеюсь, это будет полезно.

Другие вопросы по тегам