我尝试在由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后超时
答案 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;
,因为它使量角器不必等待角度承诺。
和browser.ignoreSynchronization = false;
后跟browser.waitForAngular();