>场景:每当用户使用不正确的凭据登录时,引导模式都会显示 1-2 秒,并显示消息"抱歉,凭据不正确"。下面是模态的 HTML。
<div class="modal-content">
<div class="modal-body note-error text-center ng-binding"> Sorry, invalid credentials! </div>
</div>
我需要验证预期的错误文本是否等于实际的错误文本。
我的代码
页面对象.js
var errorModal = element(by.css('.modal-body.note-error.text-center.ng-binding'));
this.getErrorText = function(){
var until = protractor.ExpectedConditions;
browser.wait(until.textToBePresentInElement(errorModal, "Sorry, invalid credentials!"), 3000, "Not able to find");
return errorModal.getText();
};
规格.js
expect(Login_Page.getErrorText()).toMatch('Sorry, invalid credentials!');
输出
消息: 预期"匹配"对不起,凭据无效!
我不知道为什么这种等待不起作用。
我在查看您的 [应用程序] 后找到了问题的根本原因。您要查找的错误模态始终存在于dom
中 - 这意味着isPresent()
将始终返回 true。但它在无效输入上仅可见 1 或 2 秒 - 这意味着isDisplayed()
将在几秒钟内返回true
这样做的副作用是返回值 getText()
。它只返回可见的内部文本。查看以下官方文档摘录
获取此元素的可见内部文本,包括子元素, 没有任何前导或尾随空格。可见元素不是 被 CSS 隐藏。
这就是您看到getText()
的空值的原因
我建议一个解决方法,您可以通过browser.executeScript()
提取内部文本
用return browser.executeScript('return arguments[0].textContent',errorModal)
替换return errorModal.getText()
,你应该一切都好
让我知道这是否有效
pittgoose作为 https://github.com/angular/protractor/issues/4030 的一部分提供的答案。我只是想在这里分享
好的,在每个 webdriver 动作量角器执行 browser.waitForAngular() 之前,它会等待所有角度脚本完成运行,然后再执行下一个动作。在这种情况下,我相信量角器在执行搜索之前正在等待弹出模态消失。
另外,我刚刚证明了我的理论,因为当我在browser.wait(...)之前添加browser.waitForAngularEnabled(false)时,测试通过了。前任:
browser.get('https://app.p3fy.com/#/login');
element(by.css('[name="email"]')).sendKeys('pittgoose@sampleemail.com');
element(by.css('[name="password"]')).sendKeys('blah');
element(by.css('[type="submit"]')).click();
browser.waitForAngularEnabled(false); // THIS MAKES THE TEST PASS
browser.wait(ExpectedConditions.textToBePresentInElement(element(by.id('errorDialog')), 'Sorry, invalid credentials!'), 3000, 'No!');
这对于Selenium Webdriver api来说不是问题,因为它不会等待Angular加载。