我使用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();
}
答案 0 :(得分:1)
DataTable
中消息下的值应为登录失败时期望的纯文本。理想情况下,不应包含任何xpath或任何选择器。
选择器应在pageobject中定义。同样,应该修改选择器以不包括文本本身。
这样,当测试失败时,您会得到AssertionError
,而不是得到NoSuchElementException
。无法判断测试是由于无效凭证证明有效还是通过网站上的消息更改而导致失败。
Thread.sleep()
有点皱眉。而是看一个隐式或显式等待。参阅此-http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/
答案 1 :(得分:1)
这是您的断言:
SYN, ACK, RST
其中 assert_LoginFailure 是网络元素,而 arg1 是字符串。现在,将字符串与Web元素进行比较没有任何意义,不是吗?
您必须提取 网络元素中显示的文本,例如:
org.testng.Assert.assertEquals(assert_LoginFailure,arg1);
您的断言将如下所示:
assert_LoginFailure.getText()
希望这会有所帮助。