提问人:prometheusOne 提问时间:10/30/2023 更新时间:10/30/2023 访问量:35
更改 Selenium JavaScript 的脚本超时持续时间
change script timeout duration for selenium javascript
问:
我正在使用 javascript 中 selenium webdriver 中的 executeScript 函数构建一个函数以在网站上滚动给定的时间。脚本的默认超时似乎约为 15 秒,直到引发错误 (ScriptTimeoutError)。我发现了很多关于如何修改其他语言(如 Selenium for Java)的超时长度的文档,但没有 JS 库的文档。selenium JS 的文档很糟糕。
以下测试代码重现该错误。在大约 25 秒时,它将抛出 ScriptTimeoutError
const { Builder, By, Key } = require("selenium-webdriver");
async function example() {
let driver = await new Builder().forBrowser("chrome").build();
await driver.get("https://google.com");
await driver.executeScript(`
await new Promise((resolve) => setTimeout(resolve, 30000));
`);
console.log("DONE!");
}
example();
``
下面是堆栈:
ScriptTimeoutError: script timeout
(Session info: chrome=118.0.5993.118)
at Object.throwDecodedError (c:\Users\Admin\Documents\selenium scripts\seleniumDemo\node_modules\selenium-webdriver\lib\error.js:524:15)
at parseHttpResponse (c:\Users\Admin\Documents\selenium scripts\seleniumDemo\node_modules\selenium-webdriver\lib\http.js:601:13)
at Executor.execute (c:\Users\Admin\Documents\selenium scripts\seleniumDemo\node_modules\selenium-webdriver\lib\http.js:529:28)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Driver.execute (c:\Users\Admin\Documents\selenium scripts\seleniumDemo\node_modules\selenium-webdriver\lib\webdriver.js:745:17)
at async example (c:\Users\Admin\Documents\selenium scripts\seleniumDemo\tests\test 4.js:8:3) {
remoteStacktrace: '\tGetHandleVerifier [0x00007FF705638EF2+54786]\n' +
答:
0赞
Isonimus
10/30/2023
#1
我认为您应该以异步 () 的方式执行脚本,因为您需要它来等待 promise 解析。然后,如果超时阈值仍然很低,则可以使用。driver.executeAsyncScript()
driver.manage().timeouts().setScriptTimeout()
注意 setScriptTimeout() 只会影响异步脚本。
0赞
prometheusOne
10/30/2023
#2
经过几个小时的研究,我偶然找到了解决方案。webDriver 中有一个名为 manage() 的函数。此函数允许您调用几个有用的函数来控制 Selenium 服务器。其中一个函数是 setTimeout() 接受一个对象,该对象为 webdriver 设置不同的超时(script、pageLoad、implicit)。必须使用 await 语句来设置超时,因此必须在 async 函数中完成。
await driver.manage().setTimeouts({ script: 60000 });
setTimeout 函数接受一个 javascript 对象。
{
implicit: time-in-millisecconds,
pageLoad: time-in-millisecconds,
script: time-in-millisecconds
}
以下是 Manage 类中提供的其他一些有用函数:
最终解决方案:
let webdriver = require("selenium-webdriver");
async function example() {
// create driver
let driver = await new webdriver.Builder().forBrowser("chrome").build();
// this function will set the script timeout to 60 secconds
// you can also set other timeouts with this function it takes an object
// {
// implicit: TimeInMS,
// pageLoad: timeInMS,
// script: timeInMS
// }
await driver.manage().setTimeouts({ script: 60000 });
// this function will get the different timeouts for the selenium server
// { implicit: 0, pageLoad: 300000, script: 35000 }
const timeouts = await driver.manage().
console.log(timeouts);
// go to website
await driver.get("https://bing.com");
// driver executes script for 35 secconds
await driver.executeScript(`
await new Promise((resolve) => setTimeout(resolve, 35000));
`);
console.log("DONE!");
}
example();
评论