我带着 Protractor 和 Jasmine 才一周大。我正在尝试 Promise。我的测试是尝试获取元素的原始文本并用新文本重命名它。下面是我正在尝试的代码,但输出不符合预期:
element(by.css("css of the element")).getText().then(function(oldText) {
newElementName= oldText + "-New Name";
});
browser.actions().doubleClick(element(by.css("css of the element")).perform();
element(by.css("")).sendKeys(newElementName,protractor.Key.ENTER);
element(by.css("")).getText().
then(function(afterRename) {
expect(afterRename).toEqual(newElementName);
我希望“newElementName”的值为“oldText-New Name”,但它被设置为“未定义”。
根据我到目前为止的理解,脚本被解析并创建了一系列 promise ,引用自 https://github.com/angular/protractor/issues/909 。因此,对于上面的代码,promise 将按照 .getText()、.then()、.perform() referenced 的顺序排列。 、.sendKeys()、.getText()、.then()、expect()。
为什么 .perform() 和 .sendkeys() 在 newElementName 解析之前执行? 注意:不双击元素就无法编辑文本。
还有人有“延迟对象”的任何好的教程或链接吗?我查看了很多链接,但找不到任何可以帮助我理解这个概念的内容。
最佳答案
问题在于,当您调用 sendKeys()
时,getText()
Promise 将不会得到解决。它将在 sendKeys()
返回的 Promise 解析之前解析,但那时为时已晚:参数 (newElementName
) 已经传递了一个未定义的值。
您需要做的是在调用 sendKeys()
之前先解决第一个 promise 。另外,请记住 ElementFinder可以重复使用。
var theElement = element(by.css("css of the element"));
theElement.getText().then(function(oldText) {
newElementName = oldText + "-New Name";
browser.actions()
.doubleClick(theElement)
.sendKeys(newElementName, protractor.Key.ENTER)
.perform();
afterRename = theElement.getText();
});
expect(afterRename).toEqual(newElementName);
关于promise - Protractor promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853316/