更改 Selenium JavaScript 的脚本超时持续时间

change script timeout duration for selenium javascript

提问人:prometheusOne 提问时间:10/30/2023 更新时间:10/30/2023 访问量:35

问:

我正在使用 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' +
javascript selenium-web驱动程序

评论


答:

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();