从书中学习AngularJS,有一个简单的量角器测试的例子:
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不是函数
不确定出了什么问题,深入研究Protractor文档并找出一个有效的解决方案,即:
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'));
有人可以解释一下吗?提前谢谢!
答案 0 :(得分:2)
这些功能各有不同。在您的第一个案例中,您获得error: Failed: undefined is not a function
,因为.first()
的使用不正确。 first()
函数返回ElementFinder
而不是promise。
.then()
在其上解决的承诺。 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
有效,因为它有element()
(也是一个ElementFinder)函数链接到另一个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);
希望它有所帮助。
答案 1 :(得分:0)
FindElement是一个webdriver.webElement函数,因此您必须在webElement之后使用它,这就是为什么它在上一个示例中不起作用的原因。量角器API中的文档可以帮助您获取webdriver.WebElement.findElement:
http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.findElement