【问题标题】:How to test ngx-toastr with protractor in Angular 2如何在 Angular 2 中使用量角器测试 ngx-toastr
【发布时间】:2017-04-10 11:49:12
【问题描述】:

我将 ngx-toastr 与我的 angular 2 应用程序一起使用,并且我已经开始针对它运行一些 e2e 测试。我在测试烤面包机时遇到了困难,因为它会在 5 秒后弹出并消失。

我尝试按照 Stackoverflow 上的建议添加几种不同的选择方法,但没有运气。

我试过的:

getToastr() {
    var EC = protractor.ExpectedConditions;
    var targetEle = element(by.css(".toast-message"));

    browser.wait(EC.visibilityOf(targetEle), 10000, 'NOT VISIBLE'); //wait until 
    //ele visible
    browser.wait(EC.presenceOf(targetEle), 10000, 'NOT PRESENT');
}

这使它命中了不可见的代码,即使我看到窗口中存在 toastr - 它无法在 dom 中找到它。我已经截取了 dom 的屏幕截图,以向您展示位置,因为我认为这可能与此有关。

这是 dom Screenshot of DOM 的屏幕截图,我正在尝试在开始注册部分敬酒。请注意,名为 Default 的路由器插座不包装 start-signup,即使它在路由器中声明使用此插座 - 我不知道这是否是设计使然。

{
    path: 'signup',
    children: [
        { path: '', component: StartSignupComponent, outlet: 'default' }
    ]
},

似乎 toastr div 不在 start-signup 标记内。即使使用 ngx-toastr 自己的方法将 toastr 消息移动到“您选择的”div 中,我也无法将其移动到内部。目前我将它放在 app.component 中,并将 toastr “holder” div 放在路由器插座旁边 - 我也尝试将 holder div 放在路由器插座中,但运气不好。

我从量角器得到的错误是:

    1) Create account page should have a toastr message
  - Failed: NOT VISIBLE
Wait timed out after 10334ms

Executed 28 of 28 specs (1 FAILED) in 18 secs.
[14:01:29] I/launcher - 0 instance(s) of WebDriver still running
[14:01:29] I/launcher - chrome #01 failed 1 test(s)
[14:01:29] I/launcher - overall: 1 failed spec(s)
[14:01:29] E/launcher - Process exited with error code 1
npm ERR! Test failed.  See above for more details.

如果需要,我可以提供更多信息。这是我能想到的初步信息。

克里斯的问候

【问题讨论】:

  • 你解决了这个问题吗?如果是这样,你能发布一个答案。你使用无头浏览器吗?\
  • 我不再在我有测试项目的公司工作,所以我无法验证任何答案。但是,如果有人可以验证它是否有效,我会接受答案。我从来没有让它工作,我只是最终没有测试 toastr。当我编写测试时,我使用 chrome 作为浏览器。
  • 我刚刚提供了一个我不确定它是否有效的答案。但是,如果您验证它,我会很高兴。

标签: angular testing protractor


【解决方案1】:

我想我需要更多关于上述问题的信息。 Dom 截图是不够的。如果您可以在代码中显示完整的 dom,那就太好了。而不是截图。但无论如何,如果我的猜测是正确的,你甚至不需要 ExpectedConditions。

你可以试试这个sn-p

var targetEle = element(by.css(".toast-top-right"));
var expectedEle = element(by.css(".toast-message"));

expect(targetEle.isPresent()).toBe(true).then(function(){
    expect(expectedEle.isDisplayed()).toBe(true);
});

如果您想测试烤面包机中的消息/文本,您也可以尝试element(by.cssContainingText(""))。

如果您向我展示更详细的 dom,我可能会为您提供更多建议。

我认为 5 秒后消失对于量角器来说不是问题,因为它在角度元素上是异步的。

【讨论】:

  • 我实际上实现的方式与添加 browser.wait 相同
  • 我今天下班就去试试。举个例子干杯.. :) 我会在几个小时内回复你..
  • 好的,我会等你的回复。
  • browser.wait 与预期条件和使用公开的实用程序(如 isDisplayed、isVisible 等)在概念上没有区别,因为量角器确实在内部等待。所以我不明白为什么这个答案被赞成,因为它显然没有提出任何与我已经建议的不同的建议——首先等待存在,然后检查元素是否可见。更重要的是,你怎么知道 toastr 被配置为显示在右上角?这显然是不可接受的,因为它不是通用解决方案。我给出了一个可能的解决方案和失败的最终原因。
  • 我终于开始用 toastr 设置一个新项目,我的测试似乎通过示例代码通过了,为这么久后回来干杯:) 亲切的问候 Chris
【解决方案2】:

我想我找到了这个问题的根本原因。

事实证明 Protractor 在继续之前等待 Angular 完成待处理的工作,而 Toastr 会安排一个计时器在几秒钟后自动关闭消息。

所以你的元素查找器只会在 toast 从页面中删除一条消息后执行。

要解决此问题,您需要直接使用 browser.driver.findElements 方法(来自 Selenium WebDriver),而不是使用 Protractor 定位器。

这样你就可以访问任何元素,即使 Angular 在页面中还有一些工作要做。

【讨论】:

    【解决方案3】:

    我以前使用过 toastr,我通常在等待函数中检查 toastr 容器的可见性,然后如果需要,我会在之后接收消息。直接检查消息的问题是,如果消息没有提供给 toastr,那么它就不会附加到 dom 中,因为我记得库的内部结构。所以它可能是测试捕获的代码中的一个实际错误:)。所以我的建议是应该先检查容器的 precenseOf,然后再检查可见性和消息。这最终会告诉你是否有另一个元素——比如覆盖层没有放在烤面包机的顶部,从而阻止量角器认为它是可见的,这不太可能,因为它绝对定位在一些非常大的 z-index I想想。

    【讨论】:

    • 其实没有。如果你仔细阅读代码,你会发现他检查了 toast-message。
    • 对不起,如果我对我的评论含糊不清,我是说他得到的是 NOT-VISIBLE 而不是可见
    • 那么我的回答怎么不相关呢?我没有看到需要添加示例,因为他的代码对我来说似乎没问题,但是您可以看到这个问题缺少一些相关信息。首先, toastr 容器存在于 dom 中并不意味着消息存在。在这种情况下,如果他检查容器,他最终会观察到它在那里。否则,我会假设可能存在某种覆盖层,阻止量角器将其视为可见,因此他可以首先尝试 presentOf 而不是首先检查 visibilityOf。
    • 我同意 presentOf 应该是第一位的
    • 编辑您的问题,以便我支持它。添加一段漂亮的代码,它会很棒。
    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多