当我在 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 运行两次测试,如下所示:
- SELENIUM_PROMISE_MANAGER 开启,没有覆盖率报告,以获取正确的行号
- SELENIUM_PROMISE_MANAGER 关闭,覆盖率检查打开:既要检查覆盖率,又因为无论如何行号都会出错,请借此机会确保我的 selenium 测试在没有 promise 管理器的情况下工作,并且我已经等待所有合适的地方
一旦他们修复了 selenium-webdriver@4
,这应该会更容易
关于javascript - 使用 mocha 和 selenium-webdriver js 获得有意义的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55435669/