Можно ли вернуть js PROMISE значение в селене в качестве переменной? - PullRequest
0 голосов
/ 17 февраля 2020

Я использую скрипт JS, чтобы получить одну вещь через xmlhttprequests. Мне нужно передать это значение обратно в селен, где я могу продолжить дальнейшие действия. Мой код возвращает None все время, даже если глобальная переменная была назначена и возвращена. Я где-то читал, что невозможно извлечь необработанное значение PROMISE?

    var request = ""

    function send(method,url,data){
        const xhr = new XMLHttpRequest();
        const promise = new Promise(function(resolve,reject){
            xhr.open(method, url)
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr.onload = function(){
                const raw_content = String(xhr.response)
                const start_index = raw_content.indexOf("request")
                const end_index = raw_content.indexOf("</settings>")
                const x_request = raw_content.substring(start_index+("request=").length+1, end_index-3)
                resolve(x_request)
            };
            xhr.send(data)
        });
        return promise;
    };

    async function final(){
        await send("POST", "https://www.thecrims.com/login",data).then((responseData)=>{
            request = responseData
            return responseData
        });
    };

final();
return request

Когда я помещаю приведенный выше код в driver.execute_script и пытаюсь его напечатать, он ничего не возвращает или ничего не возвращает. Есть ли другой способ получить это значение из этого?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

Ну, вы должны внести небольшое изменение в ваш метод final.

async function final(){
        const val = await send("POST", "https://www.thecrims.com/login",data).then((responseData)=>{
            request = responseData
            return responseData
        });
     return val;
    };

Это должно вернуть значение.

Вот пример теста, который я сделал для проверки сценария .

jsFunction1 = """window.send =function(method,url){ const xhr = new XMLHttpRequest();
        const promise = new Promise(function(resolve,reject){
            xhr.open(method, url)
            xhr.setRequestHeader("Content-type", "application/json");
            xhr.onload = function(){
                const raw_content = String(xhr.response)
                resolve(raw_content)
            };
            xhr.send()
        }); return promise }; """

jsFunction2 = """window.final =function(){const val =send("get","https://jsonplaceholder.typicode.com/users").then((responseData)=>{
            return responseData
        }); return val}; """

# load the function so that you can call where ever you want
driver.execute_script(jsFunction1)
driver.execute_script(jsFunction2)
value = driver.execute_script("return final()")
print(value)
0 голосов
/ 17 февраля 2020

Нашли обходной путь :) Я запускаю сообщение с содержимым переменной и удаляю это предупреждение с селеном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...