执行量角器测试时出现“失败:等待量角器与页面同步时出错”

时间:2019-05-16 10:29:17

标签: javascript angularjs angular protractor

我尝试在由Angular和非Angular组件组成的Web应用程序上执行一些Protractor测试。 我的代码如下所示:

describe("Test Name", function() {
  it("Test case", function() {
    // first execute steps on a non-Angular component
    browser.waitForAngularEnabled(false);
    // some test steps

    // then execute tests on an Angular component, which opens in a new browser tab
    browser.waitForAngularEnabled(true);
    // some more test steps
    });
});

问题是,运行上述测试后,浏览器启动并立即关闭,并出现以下错误:

  

失败:等待量角器与页面同步时发生错误:“ angularJS可测试性和角度可测试性均未定义。这可能是因为这是非角度页面,也可能是因为您的测试   涉及客户端导航,这可能会干扰量角器的引导。有关详情,请参见https://github.com/angular/protractor/issues/2643

当我从代码中删除browser.waitForAngularEnabled(true);时,非Angular组件的步骤已成功执行,然后在新的浏览器选项卡中打开了应用程序的Angular组件,在10秒钟内没有任何反应(没有任何步骤)被执行),浏览器关闭并显示以下错误:

  

失败:等待10007ms后超时

2 个答案:

答案 0 :(得分:1)

您可能应该考虑异步代码,并等待承诺解决。另外,在测试函数中添加Jasmine's done parameter,以便让硒知道测试何时结束。

可能导致此问题的另一件事是在您实际进入角度页面之前激活import { Stripe } from '@ionic-native/stripe/ngx'; constructor(private stripe: Stripe) { } ... this.stripe.setPublishableKey('my_publishable_key'); let card = { number: '4242424242424242', expMonth: 12, expYear: 2020, cvc: '220' } this.stripe.createCardToken(card) .then(token => console.log(token.id)) .catch(error => console.error(error)); 。建议您给该调用加上前缀以检查页面上的内容是否已已加载,以便在等待角度活动之前知道角度已准备好被量角器钩住。

重要的是要注意,量角器在waitForAngularEnabled之后等待下一个动作来触发检查,据此,如果某个时候以后有人更改了代码,可能使问题变得不清楚。

waitForAngularEnabled(true)

这也可能会给您带来更好的错误消息。

当然,您也可以使用async \ await语法进行同样的操作。

describe("Test Name", function() {
  it("Test case", function(done) {
    // first execute steps on a non-Angular component
    browser.waitForAngularEnabled(false)
      .then(() => /* step1 */)
      .then(() => /* step2 */)
      // ...
      //  this one is very important to make sure
      // we're in an angular page 
      .then(() => ensurePageTitleIsVisible())
      .then(() => browser.waitForAngularEnabled(true))
      .then(() => done())
      .catch((err) => done.fail(err));
  });
});

function ensurePageTitleIsVisible() {
  return browser.wait(ExpectedConditions.visibilityOf(PAGE_TITLE_SELECTOR), jasmine.DEFAULT_TIMEOUT_INTERVAL, 'Title does not exist after timeout');
}

基本上,发生问题是因为您在describe("Test Name", function() { it("Test case", function(done) { try { // first execute steps on a non-Angular component await browser.waitForAngularEnabled(false) await step1(); await step2(); // ... await browser.waitForAngularEnabled(true); done(); } catch(err) { done.fail(err); } }); }); 函数实际完成之前继续进行测试。

答案 1 :(得分:0)

在与非角度ui交互时使用browser.ignoreSynchronization = true;,因为它使量角器不必等待角度承诺。

与角度ui交互时,

browser.ignoreSynchronization = false;后跟browser.waitForAngular();