【问题标题】:Protractor wait command is not able to wait for the bootstrap modal to appear量角器等待命令无法等待引导模式出现
【发布时间】:2017-06-09 07:26:10
【问题描述】:

场景:每当用户使用不正确的凭据登录时,都会出现 1-2 秒的引导模式,并显示消息“抱歉,凭据不正确”。 下面是模态框的 HTML。

<div class="modal-content">
<div class="modal-body note-error text-center ng-binding"> Sorry, invalid credentials! </div>
</div>

我需要验证预期的错误文本是否等于实际的错误文本。

我的代码

PageObject.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();

 };

Spec.js

expect(Login_Page.getErrorText()).toMatch('Sorry, invalid credentials!');

输出

消息: 预期 '' 匹配 '对不起,无效的凭据!'。

我不知道为什么这个等待不起作用。

【问题讨论】:

  • 您是否尝试过使用getText() 直接提取文本? return errorModal.getText()
  • 是的,已经这样做了..
  • dom 中有很多模态窗口并且一次仅基于某个触发器抛出 1(或没有)时,我通常会看到此问题。但量角器总是会选择dom 中的第一个。如果没有,您能否粘贴完整的 html ...您能否检查您的 HTML 中是否有超过 1 个带有 modal-body 的元素?
  • 您可以使用下面提到的 url app.p3fy.com/#/login 并尝试使用无效凭据登录(当然您不需要有效的凭据:D)。我需要捕获出现的错误模式。问题是 textToBePresentInElement 在硒中效果很好,但在量角器中效果不佳。我试过硒,它起作用了
  • 下面提到的独立 selenium 代码运行良好。我的意思是 textToBePresentInElement 正确等待 WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.textToBePresentInElement(element, "对不起,无效的凭据!")); System.out.println("got"+ element.getText());// 这打印了对不起,无效凭据!

标签: javascript angularjs automation jasmine protractor


【解决方案1】:

查看您的 [app] 后,我找到了问题的根本原因。您要查找的错误模式始终存在于 dom 中 - 这意味着 isPresent() 将始终返回 true。但它在无效输入上仅可见 1 或 2 秒 - 这意味着 isDisplayed() 将在这几秒钟内返回 true

这样做的副作用是返回值getText()。它只返回可见的 innerText。检查以下来自official documentation的摘录

获取该元素的可见innerText,包括子元素, 没有任何前导或尾随空格。可见元素不 被 CSS 隐藏。

这就是您看到来自 getText() 的空值的原因

我建议您通过browser.executeScript() 提取innerText 的解决方法

return errorModal.getText() 替换为return browser.executeScript('return arguments[0].textContent',errorModal),你应该一切都好

让我知道这是否有效

【讨论】:

  • 感谢您抽出宝贵时间调查此事。甚至我也知道这种解决方法,我之前尝试过并且它有效 browser.executeScript('return (arguments[0].textContent).trim()',errorModal)。我的主要问题是为什么 ExpectedConditions 类的 textToBePresentInElement() 静态方法不起作用。我在 selenium webdriver 中尝试了同样的方法,它奏效了。我是 Protractor 的新手,无法弄清楚为什么这不起作用,因为它仍然是 selenium webdriver api 的包装器。我还在量角器问题github.com/angular/protractor/issues/4030 中发布了这个。请建议
  • 这个逻辑简单而标准,我只在errorModal中使用expectedconditions textToBePresentInElement()方法从errorModal中获取文本。
  • 当弹出窗口在这几秒钟内可见时,您的 selenium getText() 将被触发。那是偶然的..您可以多次运行以查看它是否稳定...并且您无法检查可见性,因为textToBePresentInElement()使用presenceOf(elementFinder)visibilityOf()
  • driver.get("demo.p3fy.com/#/login"); driver.findElement(By.name("email")).sendKeys("i.kar@gmail.com"); driver.findElement(By .name("password")).sendKeys("abhis"); driver.findElement(By.xpath("//*[@id='login']/div/div/div/div/div/form/fieldset /div[3]/input")).click(); WebElement element = driver.findElement(By.xpath("//*[@id='errorDialog']/div/div/div")); WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.textToBePresentInElement(element, "对不起,凭据无效!")); System.out.println("错误文本是 "+ element.getText()); driver.关闭();}
  • 由于显式等待,它每次都能顺利运行。如果我们不使用显式等待,它就会变得不稳定。 seleniumhq.github.io/selenium/docs/api/dotnet/html/…
【解决方案2】:

这是pittgoose 作为https://github.com/angular/protractor/issues/4030 的一部分提供的答案。我只是想在这里分享一下

好的,在每个 webdriver 操作量角器执行 browser.waitForAngular() 之前,它会等待所有 Angular 脚本完成运行,然后再执行下一个操作。在这种情况下,我相信量角器在执行搜索之前正在等待弹出模式消失。

另外,我刚刚证明了我的理论,因为当我在 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 加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多