量角器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'));
解释-
.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
,所以你在使用它时会出错。
.element()
是一个 ElementFinder,因此在单独使用或与其他 ElementArrayFinder
或 ElementFinder
链接时也能正常工作。 link1
就是一个例子。 ElementFinder 的有效语法 -
element(LOCATOR);
element(LOCATOR1).element(LOCATOR2);
element.all(PARENT_LOCATOR).element(LOCATOR);
希望对您有所帮助。
从书上学习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'));
解释-
.findElement()
在两个实例之上工作,一个是element
and the other one is abrowser
ordriver
。link1
有效,因为它有一个element()
(这也是一个 ElementFinder)函数链接到另一个 ElementFinder 及其有效。link2
在其语法中是有效的,因为findElement()
链接到getWebElement()
。如上所述,这是有效的,因为getWebElement()
returns 和element
。- 但是您的
link3
不起作用,因为 function/method 的语法链不正确。findElement()
既没有链接到element
也没有链接到browser
实例,但它链接到ElementFinder
,所以你在使用它时会出错。
.element()
是一个 ElementFinder,因此在单独使用或与其他ElementArrayFinder
或ElementFinder
链接时也能正常工作。link1
就是一个例子。 ElementFinder 的有效语法 -element(LOCATOR); element(LOCATOR1).element(LOCATOR2); element.all(PARENT_LOCATOR).element(LOCATOR);
希望对您有所帮助。