我在节点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
等。但除了失败之外没有其他错误,我该如何调试?
答案 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");
})