Selenium - обратный вызов не предусмотрен в execute_async_script - PullRequest
1 голос
/ 16 апреля 2019

У меня есть следующий код, который должен подождать 2 секунды, пока выполняется этот асинхронный Javascript, а затем вызвать обратный вызов.Но по какой-то причине arguments[0] не является обратным вызовом, хотя найденная мною документация Selenium гласит, что с execute_async_script функция обратного вызова автоматически вводится в массив arguments.

driver.execute_async_script(f"""
    function sleep(ms) {{
    return new Promise(resolve => setTimeout(resolve, ms));
    }}
    async function test() {{
        console.log("before 2")
        await sleep(2000)
        console.log("after 2")
        console.log(arguments)
        arguments[0]()
    }}
    test()
    """)

arguments зарегистрирован как пустой массив.

Что происходит?

Документация Selenium: https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#executeAsyncScript

1 Ответ

0 голосов
/ 19 апреля 2019

Вам необходимо сохранить обратный вызов в начале исполняемого Javascript, например:

driver.execute_async_script(f"""
const cb = arguments[arguments.length - 1]
function sleep(ms) {{
return new Promise(resolve => setTimeout(resolve, ms));
}}
async function test() {{
    console.log("before 2")
    await sleep(2000)
    console.log("after 2")
    console.log(arguments)
    cb()
}}
test()
""")

Это имеет смысл, потому что arguments - это объект, который изменяется в зависимости от функции, к которой он обращался.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

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