Javascript `NoSuchSessionError:使用selenium时会话id`无效,即使应用程序运行正常

Javascript `NoSuchSessionError:使用selenium时会话id`无效,即使应用程序运行正常,javascript,node.js,selenium,selenium-webdriver,web-scraping,Javascript,Node.js,Selenium,Selenium Webdriver,Web Scraping,上下文和信息: (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

上下文和信息:

(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)
})
我最近制作了一个简单的脚本,可以登录到外部网站并获取一些数据。该脚本的目的是获取学生的成绩,然后将其转换为绘图数据。为了简化获取数据的过程,我使用了npm库:SeleniumWebDriver。我之所以使用该库而不是请求(例如),是因为我需要登录,这样我就不会出现跨源错误(是的,我会出现跨源错误,因为我的服务器已经连接到前端应用程序)。请注意,我的所有代码都在异步函数中,调用它就像承诺一样(这意味着使用
调用它,然后使用
调用,而不是使用
等待
在异步函数中调用)

问题:

(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)
})
这个脚本工作得很好,给了我想要的确切结果,但我仍然得到了一个错误。这个错误让我感到困惑,因为有两个原因:第一,因为我的所有代码都在一个try块中,其中附加了catch,并且在调用它的地方有一个
.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)
})
我的代码:

(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)
})
我的问题:

(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块没有捕获此错误

其他信息:

(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)
})
节点版本:11.8.0


Selenium webdriver版本:4.0.0-alpha.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()

我认为您只是缺少当前selenium导入中的
选项
功能。如果像这样将这些添加到当前导入行中,是否有效
const{Builder、By、Key、Options、Capabilities,直到}=require('selenium-webdriver')
发生相同的错误吗?另外,您是否可以将您添加的代码编辑到您的问题中?谢谢您更新问题。我看不出您在哪里添加了
选项。在chrome选项中添加参数([“--remote debugging port=“+nextPort])
。我遗漏了什么吗?我本想在
options.addArguments([“--remote debugging port=“+nextPort])之前定义它的。
但是忘了我使用的是什么语言。我的编辑更好吗?您可以使用任何可用的端口号,关键是将调试信息发送到其他地方,以便在所有测试通过时不会出现这些错误。