Я запускаю интеграционные тесты с использованием 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)





Для меня это было решено, когда я добавил:
"--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);
По той причине, что обещания были добавлены, чтобы предотвратить ад обратного вызова. Поэтому, не вдаваясь в подробности о
openWindowили ваших тестовых примерах, вы уже можете предположить, что вы неправильно используете Promises. Присмотревшись, можно увидеть, что вы всегда запускаете отдельную цепочку обещаний, которую не возвращаете и для которой также не добавляетеcatch, поэтому большинство ваших цепочек обещаний являются кандидатами на выдачу UnhandledPromiseRejectionWarning.