【问题标题】:Protractor promise resolution with getText()量角器承诺解决与 getText()
【发布时间】:2017-06-03 04:26:43
【问题描述】:

我像这样调用 getText() 函数,然后尝试解决承诺,但稍后无法获取字符串值。

var textFromElement = someElement.getText().then(function(text){return text})
var splittedText = textFromElement.split(" ")

如何获取文本以供以后使用?

【问题讨论】:

  • 并非如此,因为这个问题特定于量角器 API
  • 查看here 并找到以“WebDriver 的幕后...”开头的段落。现在注意该段落是如何结束的,“...(除非我们特别希望调用返回的结果)”。除非我完全误读了您的意图,否则该附带条件是我相信我的“可能重复......”在这里是合适的关键。
  • 我同意这是一个异步调用问题。但是量角器正在为您处理大部分异步魔法。因此,在了解量角器承诺流程之前,初级量角器开发人员不太可能识别它。

标签: angular promise protractor


【解决方案1】:

你不明白的是javascript编译器是如何处理promise的。

这就是编译器如何看待你的代码;

var textFromElement = someElement.getText().then(function(text){return text})
var splittedText = textFromElement.split(" ")

1 - 所有变量都是在函数范围的顶部创建的,无论你在哪里分配它。

var textFromElement; (= undefined)
var splittedText; (= undefined)

2 - 为每一行做最少的工作并移动到下一行。

testFromElement = {promise element object};
splittedText = {promise element object}.split(" "); (= undefined)//This what you don't want.

3 - 从顶部开始,在未解决的行上做更多的最小工作。

testFromElement = {promise getText object};

4 - 从顶部开始,在未解决的行上做更多的最小工作。

testFromElement = "text text";

简而言之,它会先分配 splittedText 三个步骤。

好例子:

var splittedText;
it("should get split text", function(done) {
  someElement.getText().then(function(textFromElement){
    splittedText = textFromElement.split(" ");
    done();
  })
})

1 - 所有变量都是在函数范围的顶部创建的,无论你在哪里分配它。

var splittedText; (= undefined)

2 - 在调用 done() 之前,只有在这个函数内部完成工作

it("should get split text", function(done) {

3 - 为每一行做最少的工作并移到下一行。

someElement = {promise element object};

4 - 从函数的顶部开始,对未解决的行做更少的工作。

someElement.getText() = {promise getText object};

5 - 从函数的顶部开始,对未解决的行做更少的工作。

textFromElement = "text text";
splittedText = textFromElement.split(" "); (["text","text"]);
done();  //the compiler can now to work outside this function

【讨论】:

    【解决方案2】:

    您的问题是您将 .then() 方法的分辨率分配给您的变量,而不是您作为参数提供给它的回调。

    总而言之,量角器/茉莉花带有异步测试机制。

    这里有 ES6 示例。

    it('some description', (done) => {
        someElement.getText().then(text => {
            var splittedText = text.split(" ");
            done();
        });
    });
    

    和 ES5:

    it('some description', function(done) => {
        someElement.getText().then(function(text){
            var splittedText = text.split(" ");
        }).finally(done);
    });
    

    【讨论】:

    • 我的代码在一个由 it 函数调用的函数中运行,所以我不知道你的示例将如何应用。如果我尝试在外面使用 splittedText 我得到了 undefined
    • 而且你总是会得到未定义的,只要你试图从同步部分中的异步代码中获取值。 Promise 被解析为异步的,所以如果你想操作值,你必须在 Promise 回调中进行。我只是给了你一个例子,你如何让你的测试等待异步代码。
    • 也许您会提供更多详细信息/代码。然后我会看到你的问题的背景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2016-05-04
    • 2019-07-07
    • 2014-08-08
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多