selenium-server不会`setValue`

时间:2018-03-22 02:46:05

标签: selenium webdriver nightwatch.js

我在节点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();

将打开该网址,等待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缓存,重新运行npm install等。但除了失败之外没有其他错误,我该如何调试?

2 个答案:

答案 0 :(得分:1)

假设您尝试使用Chrome进行测试,则需要更新ChromeDriver。 Chrome 65最近发布,较旧的ChromeDriver版本显然与它不兼容。

downloads页面下载最新版本。

让守夜人使用它,nightwatch.json -

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

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

答案 1 :(得分:0)

错误说明了一切:

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

在您的代码块中,您已为 WebElement 标识为'输入[name = bar]',并且下次调用了wait,导致setValue()这是成功的如下:

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

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

解决方案

您需要通过关联的 JavaScript HTML DOM 中的值呈现服务员 ie expect子句>如下:

.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");
})