Передача параметров в таблицах данных 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);
Надеюсь, это будет полезно.