javascript - 使用 mocha 和 selenium-webdriver js 获得有意义的堆栈跟踪

标签 javascript node.js selenium selenium-webdriver async-await

当我在 JavaScript selenium 测试中找不到元素时,它并没有给我一个简单的方法来找出失败的行:

这是一个例子:

// test.js

const webdriver = require('selenium-webdriver');
const Builder = webdriver.Builder;
const By = webdriver.By;

describe('web driver', function() {
  let driver;
  beforeEach(function() {
    return new Builder().forBrowser('chrome').build().then(function(_driver) {
      driver = _driver;
    });
  });

  it('should always be able to find the element', function() {
    return driver.findElement(By.name('test-element'));
  });

  afterEach(function() {
    return driver.quit();
  });
});

当这样运行时:

npm install selenium-webdriver@4.0.0-alpha.1
npm install mocha@6.0.2
nvm install 8.15.1
nvm use 8.15.1
node_modules/.bin/mocha test.js

我收到以下错误:

     NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[name="test-element"]"}
  (Session info: chrome=72.0.3626.121)
  (Driver info: chromedriver=2.42.591071 (0b695ff80972cc1a65a5cd643186d2ae582cd4ac),platform=Linux 4.15.0-46-generic x86_64)
      at Object.checkLegacyResponse (node_modules/selenium-webdriver/lib/error.js:585:15)
      at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:533:13)
      at Executor.execute (node_modules/selenium-webdriver/lib/http.js:468:26)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:189:7

这在这个测试中很容易理解,但在较长的测试中真的很难,因为它没有给我一行测试,而且我经常不止一次地搜索相同的元素。

有办法解决这个问题吗?

(我的实际测试是使用 async/await,但是我在没有使用 async/await 的情况下做了这个例子,问题是一样的)

最佳答案

我最终确定的解决方法是...切换到 selenium-webdriver 3,然后保持 promise 管理器处于打开状态。

$ npm install selenium-webdriver@3.6.0

然后尝试关闭 promise 管理器(这是 4 中的默认设置)

$ SELENIUM_PROMISE_MANAGER=False node_modules/.bin/mocha test.js

  web driver
    1) should always be able to find the element


  0 passing (728ms)
  1 failing

  1) web driver
       should always be able to find the element:
     NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[name="test-element"]"}
  (Session info: chrome=77.0.3865.90)
  (Driver info: chromedriver=72.0.3626.69 (3c16f8a135abc0d4da2dff33804db79b849a7c38),platform=Linux 4.15.0-64-generic x86_64)
      at Object.checkLegacyResponse (node_modules/selenium-webdriver/lib/error.js:546:15)
      at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:509:13)
      at doSend.then.response (node_modules/selenium-webdriver/lib/http.js:441:30)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:189:7)

然后再打开它

$ SELENIUM_PROMISE_MANAGER=True node_modules/.bin/mocha test.js


  web driver
    1) should always be able to find the element


  0 passing (752ms)
  1 failing

  1) web driver
       should always be able to find the element:
     NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[name="test-element"]"}
  (Session info: chrome=77.0.3865.90)
  (Driver info: chromedriver=72.0.3626.69 (3c16f8a135abc0d4da2dff33804db79b849a7c38),platform=Linux 4.15.0-64-generic x86_64)
      at Object.checkLegacyResponse (node_modules/selenium-webdriver/lib/error.js:546:15)
      at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:509:13)
      at doSend.then.response (node_modules/selenium-webdriver/lib/http.js:441:30)
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:189:7)
  From: Task: WebDriver.findElement(By(css selector, *[name="test-element"]))
      at Driver.schedule (node_modules/selenium-webdriver/lib/webdriver.js:807:17)
      at Driver.findElement (node_modules/selenium-webdriver/lib/webdriver.js:1014:17)
      at Context.<anonymous> (test.js:16:19)
      at ManagedPromise.invokeCallback_ (node_modules/selenium-webdriver/lib/promise.js:1376:14)
      at TaskQueue.execute_ (node_modules/selenium-webdriver/lib/promise.js:3084:14)
      at TaskQueue.executeNext_ (node_modules/selenium-webdriver/lib/promise.js:3067:27)
      at asyncRun (node_modules/selenium-webdriver/lib/promise.js:2927:27)
      at /home/alex/pex2/selenium-line-workaround/node_modules/selenium-webdriver/lib/promise.js:668:7
      at <anonymous>
      at process._tickCallback (internal/process/next_tick.js:189:7)

这不是唯一扰乱我的堆栈跟踪的东西。 instanbul/nyc 和 async/await 也引起了问题。 Node 12 解决了异步/等待问题。然而,可用版本的 selenium-webdriver@4 仍然无法提供正确的堆栈跟踪,即使 node-12 也是如此。由于 instanbul/nyc 还弄乱了堆栈跟踪行号,我决定使用 node-12 运行两次测试,如下所示:

  1. SELENIUM_PROMISE_MANAGER 开启,没有覆盖率报告,以获取正确的行号
  2. SELENIUM_PROMISE_MANAGER 关闭,覆盖率检查打开:既要检查覆盖率,又因为无论如何行号都会出错,请借此机会确保我的 selenium 测试在没有 promise 管理器的情况下工作,并且我已经等待所有合适的地方

一旦他们修复了 selenium-webdriver@4,这应该会更容易

关于javascript - 使用 mocha 和 selenium-webdriver js 获得有意义的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435669/

相关文章:

javascript - 哈皮,错误 415 : Unsupported Media Type error

python - 在不使用任何浏览器的情况下使用 Selenium

javascript - HTML 报告输出窗口/对话框

javascript - 通过提交按钮触发 Google map 中的 places_changed

javascript - 如何使用字符串值正确查找(并最终更改)img src 属性?

node.js - 在 Jade 中,无法使样式@font-face工作

javascript - 在带有内部调用(js)的函数中使用 setInterval?

AngularJS - 访问 Node/表达 session 信息

java - 获取所有值而不是 selenium 中选定的值

python - 尝试除了在 python/selenium 中仍然抛出 NoSuchElementException 错误