从书中学习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,另一个是browserdriver


link1之所以有效,是因为它具有链接到另一个ElementFinder及其有效值的element()(也是ElementFinder)功能。
link2的语法有效,因为findElement()已链接到getWebElement()。如上所述,这是有效的,因为getWebElement()返回element
但是,您的link3不起作用,因为函数/方法的语法链接不正确。 findElement()既不链接到element实例,也不链接到browser实例,但是它链接到ElementFinder实例,因此在使用它时会出错。

.element()是ElementFinder,因此可以单独使用或与其他ElementArrayFinderElementFinder链接使用。 link1就是一个例子。 ElementFinder的有效语法-

element(LOCATOR);
element(LOCATOR1).element(LOCATOR2);
element.all(PARENT_LOCATOR).element(LOCATOR);



希望能帮助到你。

10-06 04:05