量角器ElementFinder/ElementArrayFinder 认识

Protractor ElementFinder/ElementArrayFinder understanding

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

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

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

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

这些功能各有不同。在您的第一种情况下,您得到了 error: Failed: undefined is not a function 因为 .first() 的用法不正确。 first() 函数 returns 一个 ElementFinder 而不是一个承诺。

  • 这意味着没有使用 .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 and the other one is a browser or driver

    • link1 有效,因为它有一个 element() (这也是一个 ElementFinder)函数链接到另一个 ElementFinder 及其有效。
    • link2 在其语法中是有效的,因为 findElement() 链接到 getWebElement()。如上所述,这是有效的,因为 getWebElement() returns 和 element
    • 但是您的 link3 不起作用,因为 function/method 的语法链不正确。 findElement() 既没有链接到 element 也没有链接到 browser 实例,但它链接到 ElementFinder ,所以你在使用它时会出错。
  2. .element() 是一个 ElementFinder,因此在单独使用或与其他 ElementArrayFinderElementFinder 链接时也能正常工作。 link1 就是一个例子。 ElementFinder 的有效语法 -

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

希望对您有所帮助。