硒服务器不会`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>
作为 值 。
解决方案
您需要引入一个 waiter 即 expect 子句,以便在 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
现在应该可以恢复了。
我在节点 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>
作为 值 。
解决方案
您需要引入一个 waiter 即 expect 子句,以便在 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
现在应该可以恢复了。