从书中学习AngularJS,有一个简单的Protractor测试示例:
it('Should redirect to #/posts/1/sample-title1', function () {
var posts = element.all(by.repeater('post in posts'));
posts.first().then(function (postElem) {
postElem.findElement(by.tagName('a')).then(function (a) {
a.click();
expect(protractor.getCurrentUrl()).toMatch('/posts/1/sample-title1');
});
});
});
它不起作用并引发错误:失败:undefined不是函数
不确定出了什么问题,请深入研究量角器文档并找出可行的解决方案,即:
it('Should redirect to #/posts/1/sample-title1', function () {
var link = element.all(by.repeater('post in posts')).first().element(by.tagName('a'));
link.click();
expect(browser.getCurrentUrl()).toMatch('/posts/1/sample-title1');
});
});
我很高兴它能起作用,但是我不太明白为什么它起作用,但是这里的文档仍然不是很有帮助(或者我现在太累了)。
似乎我不明白.findElement和.element之间的区别
当我换行时:
var link = element.all(by.repeater('post in posts')).first().element(by.tagName('a'));
至:
var link = element.all(by.repeater('post in posts')).first().getWebElement().findElement(by.tagName('a'));
它也可以,但是在以下情况下不起作用:
var link = element.all(by.repeater('post in posts')).first().findElement(by.tagName('a'));
有人可以解释吗?提前致谢 !
最佳答案
这些功能各有不同。在第一种情况下,您得到了error: Failed: undefined is not a function
,因为.first()
的使用不正确。 first()
函数返回一个ElementFinder
而不是一个Promise。
这意味着使用.then()
不能解决任何问题。
您可以将其与其他与ElementFinder相关的操作(例如element()
,$$
,getText()
等)链接起来。
接下来,您写的行-
var link1 = element.all(by.repeater('post in posts')).first().element(by.tagName('a'));
var link2 = element.all(by.repeater('post in posts')).first().getWebElement().findElement(by.tagName('a'));
var link3 = element.all(by.repeater('post in posts')).first().findElement(by.tagName('a'));
说明-
.findElement()
在两个实例上起作用,一个是element
,另一个是browser
或driver
。link1
之所以有效,是因为它具有链接到另一个ElementFinder及其有效值的element()
(也是ElementFinder)功能。link2
的语法有效,因为findElement()
已链接到getWebElement()
。如上所述,这是有效的,因为getWebElement()
返回element
。但是,您的
link3
不起作用,因为函数/方法的语法链接不正确。 findElement()
既不链接到element
实例,也不链接到browser
实例,但是它链接到ElementFinder
实例,因此在使用它时会出错。.element()
是ElementFinder,因此可以单独使用或与其他ElementArrayFinder
或ElementFinder
链接使用。 link1
就是一个例子。 ElementFinder的有效语法-element(LOCATOR);
element(LOCATOR1).element(LOCATOR2);
element.all(PARENT_LOCATOR).element(LOCATOR);
希望能帮助到你。