我正在尝试在Protractor中编写测试,而没有将我的测试高度耦合到页面的特定标记。
例如,给定典型的登录页面,我想测试如果提供的凭据不正确,则会显示错误消息。
我的标记显示错误的方式是:
<div class="alert alert-danger">
<ul>
<li>Invalid username or password.</li>
</ul>
</div>
这个无序列表也可能包含其他错误 - 所以我不想在列表元素本身上做出断言。在任何情况下,我可能会决定不再将错误显示为列表,并且可能希望以其他方式显示错误。
我想要的是能够断言页面包含:无效的用户名或密码。
我希望能够做到这样的事情:
expect(page.getContents()).to.contain('Invalid username or password.');
但当然这不起作用。
Protractor中是否有任何方法可以让我这样做?
答案 0 :(得分:5)
您可以使用element.getText()。
https://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.getText:
获取此元素的可见(即未被CSS隐藏)innerText,包括子元素,没有任何前导或尾随空格。
从列表中获取所有文本。然后
使用angularjs.org的例子:
expect(text).toContain("Invalid username or password")
答案 1 :(得分:2)
您可以使用xPath选择包含您要查找的文本的DOM元素,然后检查此元素是否存在。
我正在使用此代码和
var myText = "Invalid username or password.";
var selectedElement = element(by.xpath("//*[. = '" + myText + "']"));
expect(selectedElement.isPresent()).to.eventually.equal(true, "This text is not present in page.").and.notify(callback);
我已经测试了你的示例中的代码片段并且有效。注意,我正在使用chai-as-promise,所以,如果你不认识sintax,请不要担心。重要的是第二部分:expect(selectedElem)...
用于检查页面中是否存在该元素。
答案 2 :(得分:1)
这对我有用:
expect(element(by.cssContainingText('*', 'Invalid username or password.')).isPresent()).toBeTruthy();