当前位置: 首页 > 知识库问答 >
问题:

量角器:如何获取ngb警报的文本

吕扬
2023-03-14

我尝试了很多事情,我尝试了等待浏览器和不等待浏览器。但每次它就是不想看到警报。

SO的这篇文章似乎正是我的问题:量角器:测试引导警告,但也没有解决我的问题。

这是弹出的html代码:

<dm-alert>
 <ngb-alert>
    <div role="alert" class="alert alert-danger alert-dismissible">
      <button aria-label="Close" class="close" type="button">
            <span aria-hidden="true">×</span>
      </button>
      The description '4106-5002-5005-5006-02' has to be unique
    </div>
 </ngb-alert>
</dm-alert>

我使用async/await来确保程序等待,因此下面代码中的所有函数都是异步函数。所以我尝试这样做(也没有catch,并且有一个额外的函数用于超时)。这是页面对象内的一个方法,因此它返回值:

(脚本1)

import { $, browser, by, element, ExpectedConditions as until } from 'protractor';
await browser.wait(until.presenceOf(element(by.xpath('//ngb-alert/div[contains(@class, alert-danger)]'))), waitTimeForErrorInSeconds * 1000).then((isPresent) => {
      return isPresent;
    }).catch(() => {
      console.log('no error occured')
      return false;
    })
    return false;

像这样,这个就在测试内部:(脚本2)

await browser.wait(until.presenceOf(element(by.xpath('//ngb-alert/div[contains(@class, alert)]'))), 10 * 1000)
     .then((isPresent) => {
         console.log('is present (true):  ' + isPresent);
         let text = element(by.xpath('//ngb-alert/div[contains(@class, alert)]')).getText();
         console.log(text);
      }, (isPresent) => {
          console.log('is present (false):  ' + isPresent)
      }).catch((error) => {
          console.log('browser.wait.catch: ' + error)
      })

在这里,当警报出现或不出现时,测试总是进入“存在(错误)”。我喜欢它不会因此而不通过我的测试,但我希望它在警报弹出时注意到。

像这样(也在测试中):(脚本 3)

expect(element(by.xpath('//ngb-alert/div[contains(@class, alert)]'))
     .isDisplayed())
     .toBeFalsy();

isDisplayed总是给出一个错误,因为它找不到元素

(脚本 4)

expect(element(by.xpath('//ngb-alert/div[contains(@class, alert)]'))
     .isPresent())
     .toBeFalsy();

isPresent在不存在错误时工作得很好,但存在错误时,它不会注意到。

我通过在chrome的开发工具中搜索XPath来检查它,当它存在时,它总是立即找到它,所以这应该不是问题。在我尝试所有这些事情之前,我让它工作了。因此,通过XPath搜索它以前一直有效。

因此,我注意到我的脚本2已经很好了,但由于某种原因,直到。presenceOf不起作用,但如果我这样做了。isPresent()时,它似乎找到了元素。但是为什么呢?

这是警报的代码:

<ngb-alert [type]="notification.category" (close)="close(notification)">
    {{ notification.message }}
</ngb-alert>

因此,我认为其中一个应该在脚本2(第5行)中工作以获取通知的文本:

element(by.xpath('//ngb-alert')).getText();
element(by.xpath('//ngb-alert/div')).getText();
element(by.xpath('//ngb-alert/div[contains(@class, alert)]')).getText();
element(by.binding('notification.message')).getText();
element(by.binding('notification.message')).$('ngb-alert').getText();

但他们没有...

所以,再试一次:(脚本 5)

await browser.wait((element(by.xpath('//ngb-alert/div[contains(@class, alert-danger)]')).isPresent()), 3 * 1000)
    .then((isPresent) => {
       console.log('browser.wait.then true: ' + isPresent)
       element(by.binding('notification.message')).$('ngb-alert').getText()
                .then((text) => {
                    console.log(text);
                });
     }, (isPresents) => {
        console.log('browser.wait.then false: ' + isPresents)
     }).catch((error) => {
         // if fails
         console.log('browser.wait.catch: ' + error)

     })

这将返回
browser.wait.thentrue: false
browser.wait.catch: JavascriptError: javascript错误:角度未定义

好的,所以我在这里使用until . presence of(until = expected conditions)并且没有xpath:

        await browser.wait(until.presenceOf($('.alert-danger')), 3 * 1000)
            .then((isPresent) => {
                console.log('browser.wait.then true: ' + isPresent);
                $('ngb-alert').element(by.binding('notification.message')).getText().then((text) => {
                    console.log(text);
                });
            }, (isPresents) => {
                console.log('browser.wait.then false: ' + isPresents)
            }).catch((error) => {
                console.log('browser.wait.catch: ' + error)
            })

这里发生的情况是,当没有警报显示时,它会给出我期望的响应:

browser.wait.then false: TimeoutError: Wait timed out after 3013ms  

但是当警报显示时,它会等到警报消失,然后告诉我:

browser.wait.then false: TimeoutError: Wait timed out after 7664ms 

那么为什么它突然等待的时间比我给出的超时时间(3秒)长呢。

共有1个答案

帅煌
2023-03-14

我在这里找到了答案:

…警报的内部关闭功能已通过Angular的$timeout服务实现,该服务增加$浏览器的未完成请求计数,量角器增加忽略同步=false,正确等待,直到有任何未完成的请求。这意味着如果您不禁用同步,您将看不到打开的警报,因为量角器会暂停执行,直到它可见…

但是忽略同步已被弃用,因此您需要使用 await 浏览器.wait进行角度启用(假)。这可确保它不会等到警报消失后再检查警报的内容。

因此,这是一个在发生警报时为我获取ngb警报文本的代码(对于我的代码,我不希望发生错误,但当发生错误时,我想知道是什么错误):

await browser.waitForAngularEnabled(false);
await browser.wait(until.presenceOf(element(by.css('.alert-danger'))), 5 * 1000)
    .then((isPresent) => {
        console.log('presence of error: ' + isPresent);
        $('ngb-alert').getText().then((errorAlert) => {
          expect('no error').toBe('displayed', 
          'This error showed up when adding data source: ' + errorAlert)
        });
        }, (isNotPresent) => {
            console.log('no presence of error: ' + isNotPresent)
        }).catch((error) => {
            console.log('checking presence of error caused an error: ' + error)
        })
await browser.waitForAngularEnabled(true);

附注:通过绑定获取元素不是angular 5能做到的,会出现以下错误:

"JavascriptError: javascript error: angular is not defined".
 类似资料:
  • 问题内容: 在量角器的文档中,我看到以下示例: 此处显而易见的是,您可以使用“ by.model”在输入框中设置值,但是如果您要查看输入框并查看其中的内容,则需要使用“ by.binding”。 我有一组代码(摘要)在其中执行: (在我的真实代码中,我保存了实体,然后在编辑模式下返回了该实体,并且我正在检查我的值是否已保存。但是它仍然归结为同一件事,并且此示例代码也存在相同的问题)。 这给我一个错

  • 在量角器的文档中,我看到了下面的例子: 这里看起来很清楚的是,您可以使用“by.model”在输入框中设置值,但是如果要查看输入框并查看其中的内容,则需要使用“by.binding”。 我有一组代码,其中(总结)我这样做: (在我的真实代码中,我保存实体,然后在编辑模式下返回它,并且我正在检查我的值是否实际保存。但它仍然归结为同样的事情,这个示例代码给出了同样的问题)。 这给了我一个错误: 理论上

  • 在升级到XCode 8以及随后的Appium 1.6和IOS 10进行一些Appium测试之前,我曾经能够使用下面的XPath捕获警报中的主文本。 然而,有些事情已经改变,这不再有效。我仍然希望能够在警报文本上进行断言,并且不希望使用功能。 有人找到获取警报信息的方法了吗? 额外的问题:所有这些XPath记录在哪里?我在某个随机论坛上找到了它,但我找不到任何官方留档,也找不到它与XCode中捕获的

  • 换句话说,我刚刚成功地选择了一个下拉选项;然而,我现在想断言,选项< code>text是预期的值。 注意,我用< code > element switcher . element(by . linktext(option))选择了下拉选项值。单击下面的(): 并且呈现的 HTML 看起来像这样: 问题是,我无法访问我期望的文本,我的告诉我: 同样,我想单击下拉元素(标签),然后获取单击的同一标

  • 我正在尝试处理本机打开的警报,但量角器无法识别此警报并向控制台发送错误- 1)测试用例pull - LiveSite - Call消息:NoSuchAlertError:无警报打开(会话信息:chrome=51.0.2704.103)(驱动程序信息:chrome Driver = 2 . 14 . 313457(3d 645 C 400 EDF 2 e 2c 500566 c9aa 096063

  • 问题内容: 我正在使用量角器和茉莉花测试网站。我想知道当前网址以验证测试。 我努力了 我以这种方式使用此功能 问题答案: 如果您只想检查当前URL,请使用: 但是,如果您需要等到URL匹配某个值,请参阅答案的下一部分。 这是一个基于“ 预期条件 ”作者提供的示例的工作代码: 用法: