硒服务器不会`setValue`

selenium-server won't `setValue`

我在节点 8.9.0 上使用 selenium-server 版本 3.0.1 和 nightwatch 版本 ^0.9.12。我的 e2e 测试 运行,点击有效,阅读 DOM 有效,但 setValue 无效。

例如下面的测试:

browser
  .url("...")

  .waitForElementPresent('select[name=foo]', 5000)
  .click('select[name=foo] option:nth-child(2)')

  .waitForElementPresent('input[name=bar]', 5000)
  .setValue('input[name=bar]', "hello world")
  .getValue('input[name=bar]', function(input) {
    this.assert.equal(input.value, "hello world");
  })

  .end();

会打开url,等待foo点击第二个选项。它将等待 bar,然后失败:

Running: test
 ✔ Element <select[name=foo]> was present after 24 milliseconds.
 ✔ Element <input[name=bar]> was present after 28 milliseconds.
 ✖ Failed [equal]: ('' == 'hello world')  - expected "hello world" but got: ""
    at Object.<anonymous> (/test/e2e/specs/test.js:49:21)


FAILED:  1 assertions failed and 2 passed (4.692s)

 _________________________________________________

 TEST FAILURE:  1 assertions failed, 2 passed. (4.9s)

 ✖ test

   - run through apply process (4.692s)
   Failed [equal]: ('' == 'hello world')  - expected "hello world" but got: ""

如果我用延迟替换 setValue 并手动输入一个值,测试将通过,所以 getValue 可以正常工作。

这确实 运行,并在其他系统上通过,但我无法让它自己工作,所以我认为这是一个 selenium-server 问题。

我已经尝试了很多 101 修复,清除 npm 缓存,重新 运行ning 一个 npm install,等等。但是除了失败之外没有其他错误,我该如何调试这个?

错误说明了一切:

Failed [equal]: ('' == 'hello world')  - expected "hello world" but got: ""

在您的代码块中,您已经为标识为 'input[name=bar]'WebElement 引入了 wait 并接下来调用setValue() 成功如下:

.waitForElementPresent('input[name=bar]', 5000)
.setValue('input[name=bar]', "hello world")

现在与此 WebElement 关联的 JavaScript 标识为 'input[name=bar]' 将需要一些时间来呈现 HTML DOM 内的值。但是在您的代码块中,您试图过早地访问输入的值(在上一步中)。因此,您的脚本发现 <null> 作为

解决方案

您需要引入一个 waiterexpect 子句,以便在 HTML [=51= 中呈现值]通过关联JavaScript如下:

.waitForElementPresent('input[name=bar]', 5000)
.setValue('input[name=bar]', "hello world")
.expect.element('input[name=bar]').to.have.value.that.equals('hello world');
.getValue('input[name=bar]', function(input) {
  this.assert.equal(input.value, "hello world");
})

假设您正在尝试使用 Chrome 进行测试,您需要更新 Chrome 驱动程序。 Chrome 65 是最近发布的,旧的 Chrome 驱动程序版本显然与它不兼容。

downloads 页面下载最新的。

让 Nightwatch 使用它,nightwatch.json -

{
...
    "selenium": {
...
        "cli_args": {
            "webdriver.chrome.driver": "path/to/chromedriver.exe"

假设 Nightwatch 使用它(您可以使用 Windows 任务管理器查看它使用的是哪个 - 假设您正在使用 Windows - 查找 chromedriver.exe 的命令行), setValue 现在应该可以恢复了。