我有以下代码,应该在这个异步Javascript执行时等待2秒钟,然后调用回调。但是,出于某种原因,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
记录为空数组。
这是怎么回事?
硒文档:https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/webdriver_exports_WebDriver.html#executeAsyncScript
你需要在执行的 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