UnhandledPromiseRejectionWarning: NoSuchSessionError: недопустимый идентификатор сеанса selenium webdriver

Я запускаю интеграционные тесты с использованием Selenium. У меня "selenium-webdriver": "^4.0.0-alpha.1" and "chromedriver": "^2.42.0". Тесты проходят, но все еще получаю UnhandledPromiseRejectionWarning: NoSuchSessionError: invalid session id. Я понял, что это происходит при вызове this.driver.quit() в ловушке After. Я проверил, что идентификатор сеанса драйвера такой же в начале и при запуске ловушки После. Это код:

hooks.js

function openWindow(driver) {
  var verifyItsYouBtnXpath = "*//span[text()='Continue']/ancestor::div[@role='button']";
  switchTab(driver).then(function() {
    driver.wait(until.elementLocated(By.xpath(verifyItsYouBtnXpath))).then((verifyElement) => {
      verifyElement.click();
        navigateToEmail(driver).then(() => {
          driver.wait(until.elementLocated(By.xpath("//td[*//span[text()='Integration Test Mail Thread']]")))
            .then((element) => {
              driver.wait(until.elementIsVisible(element)).click()
                .then(() => {
                  driver.wait(until.elementLocated(By.xpath("//div[@aria-label='Thumbs Up!!']")))
                    .then(element => {
                      driver.wait(until.elementIsVisible(element)).click();
                    });
                });
            });
        });
    });
  });
}

spec.js

'use strict';

var {Then, When} = require('cucumber');
var {By, until} = require('selenium-webdriver');
var assert = require('assert');

When(/^Reaction Add-on is open$/, function (next) {
  next();
});

Then(/^User should get author name and first few words from message body$/, function (next) {
  var parentDivXpath = "//div[@jsaction='click:h5M12e; clickmod:h5M12e;']/preceding-sibling::div";
  var spanXpath = parentDivXpath + "/div/span[1]";
  this.driver.wait(
    until.elementsLocated(By.xpath(spanXpath))
  ).then(elements => {
    this.driver.wait(until.elementIsVisible(elements[0]))
      .then(element => {
        element.getText().then(text => {
          assert.equal(text, "Hello,  Please like...");
        });
      });

    this.driver.wait(until.elementIsVisible(elements[1]))
      .then(element => {
        element.getText().then(text => {
          assert.equal(text, "Done. I liked it....");
          assert.equal(elements.length, 2);
        });
      });
  });

  this.driver.wait(
    until.elementsLocated(By.xpath(spanXpath + "/following-sibling::span"))
  ).then(elements => {
    this.driver.wait(until.elementIsVisible(elements[0]))
      .then(element => {
        element.getText().then(text => {
          assert.equal(text.includes("J King"), true);
        });
      });

    this.driver.wait(until.elementIsVisible(elements[1]))
      .then(element => {
        element.getText().then(text => {
          assert.equal(text.includes("PM Meg"), true);
          assert.equal(elements.length, 2);
          next();
        });
      });
  });
});

И это ошибка, которую я получаю. Но тесты проходят.

1 scenario (1 passed)
2 steps (2 passed)
0m56.079s
(node:3178) UnhandledPromiseRejectionWarning: NoSuchSessionError: invalid session id
  (Driver info: chromedriver=2.42.591059 (a3d9684d10d61aa0c45f6723b327283be1ebaad8),platform=Mac OS X 10.13.6 x86_64)
    at Object.checkLegacyResponse (/Users/jaiprak/workspace/reaction-app/spec/integration_tests/node_modules/selenium-webdriver/lib/error.js:585:15)
    at parseHttpResponse (/Users/jaiprak/workspace/reaction-app/spec/integration_tests/node_modules/selenium-webdriver/lib/http.js:533:13)
    at Executor.execute (/Users/jaiprak/workspace/reaction-app/spec/integration_tests/node_modules/selenium-webdriver/lib/http.js:468:26)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:118:7)
(node:3178) 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: 3)

По той причине, что обещания были добавлены, чтобы предотвратить ад обратного вызова. Поэтому, не вдаваясь в подробности о openWindow или ваших тестовых примерах, вы уже можете предположить, что вы неправильно используете Promises. Присмотревшись, можно увидеть, что вы всегда запускаете отдельную цепочку обещаний, которую не возвращаете и для которой также не добавляете catch, поэтому большинство ваших цепочек обещаний являются кандидатами на выдачу UnhandledPromiseRejectionWarning.

t.niese 23.11.2018 06:52
github.com/SeleniumHQ/selenium/issues/6824 Надеюсь, это поможет другим.
Maulik 27.04.2019 00:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
7 205
2

Ответы 2

Для меня это было решено, когда я добавил:

"--remote-debugging-port = " + nextPort

Я использую переменную nexPort для использования многих драйверов Полный код:

 let options = new chrome.Options()
 nextPort++
 console.info('nextPort = ' + nextPort)
 options.addArguments(["--no-sandbox",
                       "--disable-gpu",
                       "--headless",
                       "--remote-debugging-port = " + nextPort])
 let driver = new webdriver.Builder()
     .withCapabilities(webdriver.Capabilities.chrome())
     .setChromeOptions(options)
     .build()

Используйте тайм-аут, чтобы отложить процесс, и это сработает!

setTimeout(() => {
        driver.quit();
    }, 100);

Другие вопросы по теме