Я использую сценарий 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 и пытаюсь его напечатать, он ничего не возвращает или None. Есть ли другой способ получить это значение из этого?

-2
bbzi 17 Фев 2020 в 01:05

2 ответа

Лучший ответ

Что ж, вы должны внести небольшие изменения в ваш метод 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
supputuri 17 Фев 2020 в 21:45

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

0
bbzi 17 Фев 2020 в 20:43