【问题标题】:`NoSuchSessionError: invalid session id` when using selenium, even though application is working fine`NoSuchSessionError: invalid session id` 使用 selenium 时,即使应用程序工作正常
【发布时间】:2019-03-09 19:03:06
【问题描述】:

背景和信息:

我最近制作了一个简单的脚本,可以登录到外部网站并获取一些数据。该脚本的目的是获取学生的成绩,然后将其转换为可绘制的数据。为了使获取数据的过程更容易,我使用了 npm 库:selenium-webdriver。我使用该库而不是请求(例如)的原因是因为我需要登录,所以我不会收到跨源错误(是的,我会收到跨源错误,因为我的服务器已经连接到前端结束应用程序)。请注意,我的所有代码都在一个异步函数中,并且它像一个承诺一样被调用(这意味着它是使用 .then 而不是 await 在异步函数内调用。)。

问题:

该脚本完美运行,为我提供了我想要的确切结果,但我仍然收到错误消息。由于双重原因,这个错误让我感到困惑:首先,因为我的所有代码都在一个带有 catch 的 try 块中,并且在它被调用的地方有一个 .catch();其次,在函数解析后记录错误。

错误信息:

(node:17908) UnhandledPromiseRejectionWarning: NoSuchSessionError: invalid session id
 (Driver info: chromedriver=73.0.3683.68 
(47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17134 x86_64)
at Object.checkLegacyResponse (C:\Users\Redacted\Desktop\Application\Code\node_modules\selenium-webdriver\lib\error.js:585:15)
at parseHttpResponse (C:\Users\Redacted\Desktop\Application\Code\node_modules\selenium-webdriver\lib\http.js:533:13)
at Executor.execute (C:\Users\Redacted\Desktop\Application\Code\node_modules\selenium-webdriver\lib\http.js:468:26)
at processTicksAndRejections (internal/process/next_tick.js:81:5)
(node:17908) UnhandledPromiseRejectionWarning: Unhandled promise rejection. 
This error originated either by throwing inside of an async function without a catch block,
or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:17908) [DEP0018] DeprecationWarning: Unhandled promise rejections are 
deprecated. In the future, promise rejections that are not handled will 
terminate the Node.js process with a non-zero exit code.

我的代码:

'use strict'

const {Builder, By, Key, until,  Capabilities} = require('selenium-webdriver')
const Chrome = require('selenium-webdriver/chrome')

exports.simpleGradebookGetGrades = async function(username, password) {
    const driver = new Builder().forBrowser('chrome').withCapabilities(Capabilities.chrome()).setChromeOptions(new Chrome.Options().addArguments('--remote-debugging-port=25470')).build()
    try {
        let retval = []
        await driver.get('https://simplegradebook.ca/gradebook/login.php')

        async function login(username, password) {
            await driver.findElement(By.name('userid')).sendKeys(username)
            await driver.findElement(By.name('password')).sendKeys(password)
            await driver.findElement(By.name('login')).click()
            await driver.wait(until.titleMatches(/.{20,}/))
            return
        }

        await login(username, password)

        for(let i of Object.keys(await driver.findElements(By.name('viewclasses')))) {
            await driver.wait(until.elementsLocated(By.name('viewclasses')));
            (await driver.findElements(By.name('viewclasses')))[i].click()
            await driver.wait(until.elementLocated(By.tagName('tbody')))
            retval.push(await driver.findElement(By.tagName('tbody')).getText())
            await driver.get('https://simplegradebook.ca/gradebook/login.php')
            login(username, password)
        }

        return retval
    } catch(err) {
        console.log(err)
    } finally {
        await driver.quit()
    }
}

exports.simpleGradebookGetGrades('Redacted', 'Redacted').then(result => {
    console.log(result)
}).catch(err => {
    console.log(err)
})

我的问题:

为什么会出现错误?如何删除或忽略此错误?为什么我的 catch 块没有捕捉到这个错误?

其他信息:

节点版本:11.8.0

Selenium-webdriver 版本:4.0.0-alpha.1

【问题讨论】:

    标签: javascript node.js selenium selenium-webdriver web-scraping


    【解决方案1】:

    如果您使用以下 Chrome 选项定义驱动程序,是否会消除任何错误?

    const chrome = require('selenium-webdriver/chrome')
    const webdriver = require('selenium-webdriver')
    
    let options = new chrome.Options()
    let nextPort = 9222 //for example
    options.addArguments(["--remote-debugging-port=" + nextPort])
    let driver = new webdriver.Builder()
     .withCapabilities(webdriver.Capabilities.chrome())
     .setChromeOptions(options)
     .build()
    

    【讨论】:

    • 我认为您只是在当前的硒导入中缺少 OptionsCapabilities。如果像这样将这些添加到当前的导入行中,它会起作用吗? const {Builder, By, Key, Options, Capabilities, until} = require('selenium-webdriver')
    • 出现同样的错误?另外,您能否将您添加的代码编辑到您的问题中?
    • 感谢您更新问题。我看不到您在 chrome 选项中添加了 options.addArguments(["--remote-debugging-port=" + nextPort]) 的位置。我错过了什么吗?
    • 我的意思是在 options.addArguments(["--remote-debugging-port=" + nextPort]) 之前定义它,但忘记了我使用的是什么语言。我的编辑更好吗?
    • 您可以使用任何可用的端口号,重点是将调试信息发送到其他地方,以便在所有测试通过时不会出现这些错误。
    猜你喜欢
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多