量角器 - 如何将前一个函数的字符串值传递给异步脚本?

时间:2017-08-03 20:22:45

标签: javascript asynchronous protractor

我遇到的问题是我有一个动态API调用,其url每次都会更改。因此,为了获得正确的URL,我必须在页面上获取文本并解析它,使其只显示文本的第一部分,然后将其连接到URL的第一部分。当我尝试将字符串传递给异步脚本时,它仍然以未定义的形式出现。如何将字符串放入异步脚本?

具体地将字符串获取到这行代码:     xhr.open(“GET”,APIcall,true);

var ID = element(by.css(".sometext")).getText().then(function(getFirstPartOfText) {
        //console.log(ID);
        var thing = getFirstPartOfText
        var thing2 = getFirstPartOfText.toString().split(" ");
        var thing3 = thing2[0];
        var API = "https://someAPIcall/read/";
        APIcall = API + thing3;
        return APIcall;
    }).then(function(APIcall){
        console.log(APIcall);
        browser.executeAsyncScript(function(ApiCall) {
            var callback = arguments[arguments.length - 1];
            var xhr = new XMLHttpRequest();
            xhr.open("GET", APIcall, true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4) {
                    callback(xhr.responseText);
                }
            };
            xhr.send('');
        }).then(function(str) {
            console.log(str);
            //var whatINeed = JSON.parse(str);

3 个答案:

答案 0 :(得分:0)

var ID = element(by.css(".sometext")).getText().then(function(getFirstPartOfText) {
    // this is synchronous, so there's no need to chain it using .then()
    var thing = getFirstPartOfText
    var thing2 = getFirstPartOfText.toString().split(" ");
    var thing3 = thing2[0];
    var API = "https://someAPIcall/read/";
    APIcall = API + thing3;
    return APIcall;
});

call_something(ID); // ID should be set at this point.

function call_something (APIcall) {
    console.log(APIcall);
    browser.executeAsyncScript(function(ApiCall) {
        var callback = arguments[arguments.length - 1];
        var xhr = new XMLHttpRequest();
        xhr.open("GET", APIcall, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                callback(xhr.responseText);
            }
        };
        xhr.send('');
    }).then(function(str) {
        console.log(str);
    }
}

答案 1 :(得分:0)

这里有很多事情,首先callback中的call_something不是必需的,你仍然在webdriver的承诺经理中。所以你需要做的就是返回下一个调用链的数据。此方法中的xhr.send('');引用也不是必需的。您需要做的就是调用send()JSON parse响应并返回,下一个then块应该具有JSON结果。如果您获得纯HTML,请确保URL正确。

function call_something (APIcall) {
    console.log(APIcall);
    browser.executeAsyncScript(function(ApiCall) {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", APIcall, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                return JSON.parse(xhr.responseText);
            }
        };
        xhr.send();
    }).then(function(str) {
        console.log(str);
    }
}

答案 2 :(得分:0)

我错过了一个额外的参数here

  

第一个参数是一个将被调用的函数   第二个+参数将作为参数传递给第一个参数中的函数。

var ID = element(by.css(".sometext")).getText().then(function(getFirstPartOfText) {
    //console.log(ID);
    var thing = getFirstPartOfText
    var thing2 = getFirstPartOfText.toString().split(" ");
    var thing3 = thing2[0];
    var API = "https://someAPIcall/read/";
    APIcall = API + thing3;
    return APIcall;
}).then(function(APIcall){
    console.log(APIcall);
    browser.executeAsyncScript(function(ApiCall) {
        var callback = arguments[arguments.length - 1];
        var xhr = new XMLHttpRequest();
        xhr.open("GET", APIcall, true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                callback(xhr.responseText);
            }
        };
        xhr.send('');
    }, APIcall).then(function(str) {
        console.log(str);
        //var whatINeed = JSON.parse(str);