我正在为AngularJS应用程序开发一个测试套件,并且在编写其中一个我似乎无法解决的测试脚本时遇到了一个奇怪的问题。
测试是:
it('should navigate to the Charts page', function() {
console.log("Start Charts page test");
browser.waitForAngularEnabled(false);
browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000).then(
browser.actions().
mouseMove(chartsMenuBtn).
chartsMenuBtn.click().
browser.wait(EC.urlIs(site + '/#/charts'), 5000).
perform()
);
})
当我运行测试时,它失败了,给出了原因:
失败:无法读取未定义
的属性“click”
正在调用click()
的元素是chartsMenuBtn
,我已全局定义:
var chartsMenuBtn = element(by.linkText("Charts"));
因此明确定义了元素。最重要的是,Protractor似乎只是认为它在调用click()
的位置上是未定义的 - 但它实际上在它之前使用了两次,所以如果它在那个点上是未定义的那么量角器声称它是,它在以前的两个用途中肯定是未定义的......?
我实际上在browser.call(console.log("chartsMenuBtn: ", chartsMenuBtn));
行之前添加了browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000).then(
行,只是为了确保它没有未定义,并在控制台中打印以下内容:
chartsMenuBtn: ElementFinder { browser_: ProtractorBrowser { controlFlow: [Function], schedule: [Function], setFileDetector: [Function], getExecutor: [Function], getSession: [Function], getCapabilities: [Function], quit: [Function], actions: [Function], touchActions: [Function], executeScript: [Function], ...
显示元素明确地定义在使用它的位置。
任何人都有任何想法,这个测试失败的实际原因是什么?如何让它正确运行?
答案 0 :(得分:2)
正如评论中已经指出的那样then()
看起来有点奇怪。在你的情况下,你实际上并不需要它。
我的建议:
it('should navigate to the Charts page', function() {
console.log("Start Charts page test");
browser.waitForAngularEnabled(false);
browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000);
//browser.wait(EC.invisibilityOf(blockingElement), 5000);
chartsMenuBtn.click(); //works, if the element is defined as you said
browser.wait(EC.urlIs(site + '/#/charts'), 5000);
})
如果(正如您所说)您的按钮无法点击,当您click()
时,请尝试browser.wait(EC.invisibilityOf(blockingElement), 5000)
。
那个“isNotClickable”消息比“无法读取未定义属性”的错误更少。 “isNotClickable”表示它是有效的代码,但网页目前不允许您执行此操作。 “无法读取属性”告诉你,你的代码是错误的。
一般情况下,如果只检查the Protractor API here,通常会找到解决方案。这里列出了所有有用的命令。