【问题标题】:get a meaningful stack trace with mocha and selenium-webdriver js使用 mocha 和 selenium-webdriver js 获得有意义的堆栈跟踪
【发布时间】:2019-08-21 11:18:40
【问题描述】:

当我在 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,但我没有做这个例子,问题是一样的)

【问题讨论】:

  • 如果您使用bluebird 来获取异步代码的正确堆栈跟踪会怎样?
  • 我刚试了下,没解决。非 selenium 断言失败的堆栈跟踪已经足够好,而且 selenium 的堆栈跟踪在我的脚本中都没有行号。

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


【解决方案1】:

现在我有了更好的解决方法。

这里有一个比我更复杂的修复:https://github.com/rundeck/rundeck/pull/6355/files(在此问题的错误报告中提到https://github.com/SeleniumHQ/selenium/issues/7626

我只是在这个包装器中包装对 driver 方法的每个调用:https://gitlab.com/alex028502/binary-tools/-/tree/master/ip-address/fix-selenium-stack-trace

(我认为您至少需要节点 12 才能工作)

function fixSeleniumStackTrace (snippet) {
  const stack = new Error('start of stack trace wrapper').stack;
  try {
    return Promise.resolve(snippet()).catch(function(e) {
      e.stack = e.stack + '\n' + stack;
      throw e;
    });
  } catch (e) {
    e.stack = e.stack + '\n' + stack;
    throw e;
  }
};

喜欢这个

const bodyTag = await fixSeleniumStackTrace(function () {
  return driver.findElement(By.tagName('body'));
});

而且由于我的大部分电话都是在助手中,所以它并不像看起来那么糟糕。我只需要将呼叫包装在我的助手中。我可以在版本 3 中关闭 SELENIUM_PROMISE_MANAGER,或者使用版​​本 4。

【讨论】:

    【解决方案2】:

    试试这个(适用于最新的 selenium webdriver,即 4.0.0-alpha.5

    在 .babelrc 文件中

      "presets": [
        [
          "@babel/preset-env",
          {
            "targets": {
              "node": "current"
            }
          }
        ]
      ],
      "sourceMaps": "both"
    }
    

    在 package.json 文件中

    "scripts": {
        "test": "mocha --require @babel/polyfill --require @babel/register --timeout 10000"
      }
    

    请参考如何使用 babel 设置 mocha link

         NoSuchElementError: no such element: Unable to locate element: {"method":"partial link text","selector":"ForgoT"}
      (Session info: chrome=78.0.3904.87)
          at Object.throwDecodedError (node_modules/selenium-webdriver/lib/error.js:550:15)
          at parseHttpResponse (node_modules/selenium-webdriver/lib/http.js:563:13)
          at Executor.execute (node_modules/selenium-webdriver/lib/http.js:489:26)
          at processTicksAndRejections (internal/process/task_queues.js:93:5)
          at Driver.execute (node_modules/selenium-webdriver/lib/webdriver.js:699:17)
          at toWireValue (node_modules/selenium-webdriver/lib/webdriver.js:138:15)
          at /home/deepak/myApps/junk/node_modules/selenium-webdriver/lib/webdriver.js:189:16
          at forEachKey (node_modules/selenium-webdriver/lib/webdriver.js:183:9)
          at convertKeys (node_modules/selenium-webdriver/lib/webdriver.js:188:3)
          at Driver.execute (node_modules/selenium-webdriver/lib/webdriver.js:697:22)
          at Context.<anonymous> (test/sampleDriver.js:29:5)
    
    

    【讨论】:

    • 嗨。感谢您的回答。即使我执行上述操作,我仍然没有在堆栈跟踪中看到任何提及 test.js 的内容。您的固定堆栈跟踪是什么样的?
    • 它仍然没有说出问题开始的test.js 中的那一行
    • 没有像at Context.&lt;anonymous&gt; (test.js:16:19)
    • 在上下文中。 (test/sampleDriver.js:29:5)。我的文件名为 sampleDriver.js
    • oooh - 不同的测试文件。凉爽的。我的不这样做,但我会继续努力。非常感谢
    【解决方案3】:

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

    $ npm install selenium-webdriver@3.6.0
    

    然后尝试关闭承诺管理器(如 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 也引起了问题。节点 12 解决了异步/等待问题。然而,即使 with node-12,可用版本的 selenium-webdriver@4 仍然没有给出正确的堆栈跟踪。由于 instanbul/nyc 也会弄乱堆栈跟踪行号,因此我决定使用 node-12 运行两次测试,如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多