Javascript Selenium-Driver.quit()生成一个;未经处理的PromiserEjectionWarning:无此会话错误“;关闭webdriver后

Javascript Selenium-Driver.quit()生成一个;未经处理的PromiserEjectionWarning:无此会话错误“;关闭webdriver后,javascript,node.js,selenium,selenium-webdriver,Javascript,Node.js,Selenium,Selenium Webdriver,我在Node中使用express制作了一个API。该API有一个端点,当调用该端点时,它会执行一个方法来启动SeleniumWebDriver实例并在网页中填充表单。在该方法结束时,我尝试执行driver.quit()关闭webdriver,但不管怎样,我都会得到相同的错误: (node:18608) UnhandledPromiseRejectionWarning: NoSuchSessionError: Tried to run command without establishing a

我在Node中使用express制作了一个API。该API有一个端点,当调用该端点时,它会执行一个方法来启动SeleniumWebDriver实例并在网页中填充表单。在该方法结束时,我尝试执行driver.quit()关闭webdriver,但不管怎样,我都会得到相同的错误:

(node:18608) UnhandledPromiseRejectionWarning: NoSuchSessionError: Tried to run command without establishing a connection
    at Object.throwDecodedError (D:\bot\node_modules\selenium-webdriver\lib\error.js:517:15)
    at parseHttpResponse (D:\bot\node_modules\selenium-webdriver\lib\http.js:655:13)
    at Executor.execute (D:\bot\node_modules\selenium-webdriver\lib\http.js:581:28)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async thenableWebDriverProxy.execute (D:\bot\node_modules\selenium-webdriver\lib\webdriver.js:724:17)
    at async thenableWebDriverProxy.findElements (D:\bot\node_modules\selenium-webdriver\lib\webdriver.js:1020:17)
(Use `node --trace-warnings ...` to show where the warning was created)
环境

  • 视窗10
  • 节点v14.7.0
  • selenium webdriver:4.0.0-alpha.8
  • 快递:4.17.1
  • geckodriver的最新版本(0.29.0)
  • Firefox的最新版本(85.0)
我所做的

根据selenium文档,我使用wait/async来处理webdriver的所有承诺。此外,我用try-catch来包围方法的执行。以下是主方法的精简版本:

let driver;    

module.exports.bot = async function(user, password, var_a, var_b) {
    try {
        await (driver = new Builder().forBrowser('firefox').setFirefoxOptions(options).build());

        logger("Starting...");
        // Go to main page
        await driver.get("https://www.example.com");
        // Find the dropdown and hover it
        await hoverDropdown();

        const button = await driver.findElement(By.id("j_idt8:j_idt18"));
        await button.click();

        await login(user, password);
        logger("Logged in successfuly");
        await fillForm(var_a, var_b);    

        logger("Finishing...");
    } catch (error) {
        throw error;
    } finally {
        if (driver)
            await driver.quit();           
    }
};
在该方法完成执行(执行driver.quit之后的事件)后,节点崩溃,并显示UnhandledPromisejectionWarning


我该怎么办?谁能帮我一把吗?

我发现了错误。我将发布它,以防有人偶然发现相同(或类似)的问题

事实证明,我在代码中错误地使用了selenium的“wait”方法。文档中说“等待将反复评估条件,直到返回真实值”

由于我的语法错误,wait方法从未超时,因此它一直在循环。。。即使在执行driver.quit()之后

这就是为什么崩溃节点的错误有这条线。它试图找到元素

at async thenableWebDriverProxy.findElements (D:\bot\node_modules\selenium-webdriver\lib\webdriver.js:1020:17)
语法错误:

await driver.wait(until.elementLocated(By.id("msgError"), 1000));
await driver.wait(until.elementLocated(By.id("msgError")), 1000);
正确语法:

await driver.wait(until.elementLocated(By.id("msgError"), 1000));
await driver.wait(until.elementLocated(By.id("msgError")), 1000);

同样重要的是要注意,此方法会引发异常(超时异常),因此您也必须尝试捕获它。

您将获得哪一行error@PDHide嗯,我真的不知道。执行完所有操作后,错误就会弹出。即使在express返回API调用响应之后。正如您在OP中所看到的,显示的消息并没有指明它发生在我的代码的哪一行(它显示了SeleniumWebDriver内部的几行代码)。您可以尝试删除throw error命令吗?