量角器ElementFinder / ElementArrayFinder的理解

时间:2015-10-21 19:17:41

标签: javascript angularjs selenium jasmine protractor

从书中学习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'));

有人可以解释一下吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

这些功能各有不同。在您的第一个案例中,您获得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'));

说明 -

  1. .findElement()在两个实例之上工作,一个是element,另一个是browserdriver

    • link1有效,因为它有element()(也是一个ElementFinder)函数链接到另一个ElementFinder并且有效。
    • link2在语法中有效,因为findElement()被链接到getWebElement()。如上所述,这是有效的,因为getWebElement()会返回element
    • 但是您的link3不起作用,因为函数/方法的语法链不合适。 findElement()既不会链接到element也不会链接到browser实例,但会链接到ElementFinder,因此您在使用时会出错。
  2. .element()是一个ElementFinder,因此可以单独使用或与其他ElementArrayFinderElementFinder链接使用。 link1就是一个例子。 ElementFinder的有效语法 -

    element(LOCATOR);
    element(LOCATOR1).element(LOCATOR2);
    element.all(PARENT_LOCATOR).element(LOCATOR);
    
  3. 希望它有所帮助。

答案 1 :(得分:0)

FindElement是一个webdriver.webElement函数,因此您必须在webElement之后使用它,这就是为什么它在上一个示例中不起作用的原因。量角器API中的文档可以帮助您获取webdriver.WebElement.findElement:

http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.findElement