Node.js 未经处理的PromisejectionWarning:NoSuchSessionError:会话id selenium webdriver无效

Node.js 未经处理的PromisejectionWarning:NoSuchSessionError:会话id selenium webdriver无效,node.js,selenium-webdriver,selenium-chromedriver,integration-testing,Node.js,Selenium Webdriver,Selenium Chromedriver,Integration Testing,我正在使用Selenium运行集成测试。 我有“selenium webdriver”:“^4.0.0-alpha.1”和“chromedriver”:“^2.42.0”。测试正在通过,但仍获得未处理的PromisejectionWarning:NoSuchSessionError:invalid session id。我在After hook中调用this.driver.quit()时发现了这种情况。我已经检查了驱动程序的sessionId在开始时和在hook之后运行时是相同的。代码如下: h

我正在使用Selenium运行集成测试。 我有
“selenium webdriver”:“^4.0.0-alpha.1”和“chromedriver”:“^2.42.0”
。测试正在通过,但仍获得未处理的PromisejectionWarning:NoSuchSessionError:invalid session id。我在After hook中调用
this.driver.quit()
时发现了这种情况。我已经检查了驱动程序的sessionId在开始时和在hook之后运行时是相同的。代码如下:

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();
                    });
                });
            });
        });
    });
  });
}
'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();
        });
      });
  });
});
spec.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();
                    });
                });
            });
        });
    });
  });
}
'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)
1个场景(通过1个)
2个步骤(2个通过)
0m56.079s
(节点:3178)未处理的PromisejectionWarning:NoSuchSessionError:会话id无效
(驱动程序信息:chromedriver=2.42.591059(a3d9684d10d61aa0c45f6723b327283be1ebaad8),平台=Mac OS X 10.13.6 x8664)
在Object.checkLegacyResponse(/Users/jaiprak/workspace/reaction-app/spec/integration\u tests/node\u modules/selenium webdriver/lib/error.js:585:15)
在parseHttpResponse(/Users/jaiprak/workspace/reaction-app/spec/integration\u tests/node\u modules/selenium webdriver/lib/http.js:533:13)
在Executor.execute(/Users/jaiprak/workspace/reaction-app/spec/integration\u tests/node\u modules/selenium webdriver/lib/http.js:468:26)
在
在进程中。_tick回调(内部/process/next_tick.js:118:7)
(节点:3178)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:3)

对我来说,当我添加以下内容时,问题就解决了:

"--remote-debugging-port=" + nextPort
我使用varibale nextPort来使用许多驱动程序 完整代码:

 let options = new chrome.Options()
 nextPort++
 console.log('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
或您的测试用例,您可能已经假设您使用了错误的方法。仔细看一看,您会发现您总是启动一个分离的承诺链,您不会返回,也不会为此添加一个
catch
,因此您的大多数承诺链都可能抛出一个未处理的PromisejectionWarning,希望它对其他人有所帮助。