`NoSuchSessionError: неверный идентификатор сессии` при использовании селена, даже если приложение работает нормально - PullRequest
1 голос
/ 09 марта 2019

Контекст и информация:

Недавно я сделал простой скрипт, который заходит на внешний сайт и получает некоторые данные. Цель этого сценария состояла в том, чтобы получить оценки учеников и затем превратить их в графические данные. Чтобы облегчить процесс получения данных, я использовал библиотеку npm: selenium-webdriver. Причина, по которой я использовал эту библиотеку вместо запроса (например), заключается в том, что мне нужно войти в систему, и поэтому я не получаю ошибку перекрестного источника (и да, я получу ошибку перекрестного источника, потому что мой сервер уже подключен к фронту конец приложения). Обратите внимание, что весь мой код находится внутри асинхронной функции и что он вызывается как обещание (это означает, что он вызывается с .then, а не с await внутри асинхронной функции.).

Выпуск:

Сценарий работает отлично, давая мне точные результаты, которые я хочу, но я все еще получаю ошибку. Эта ошибка сбивает меня с толку из-за двойственности: во-первых, потому что весь мой код находится в блоке 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)
})

Мой вопрос:

Почему происходит ошибка? Как я могу удалить или игнорировать эту ошибку? Почему мой блок catch не перехватывает эту ошибку?

Дополнительная информация:

Версия узла: 11.8.0

Версия Selenium-webdriver: 4.0.0-alpha.1

1 Ответ

1 голос
/ 09 марта 2019

Устранены ли какие-либо ошибки, если вы определили свой драйвер со следующей опцией для 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()
...