我使用TDD方法开发了一个网络程序。因此,测试使用Selenium WebDriver库。但我想我的程序无法正常工作。以下是源代码。
公共/ index.html中:
<h1 class="hello">Hello, world!</h1>
测试/ test.js:
'use strict'
var assert = require('assert')
var webdriver = require('selenium-webdriver'),
By = webdriver.By,
until = webdriver.until
var driver;
before(() => {
driver = new webdriver.Builder()
.forBrowser('chrome')
.build()
})
describe('Index page', () => {
before(() => {
driver.get('http://localhost:8080/')
})
it('should show hello greetings', () => {
let hello = driver.findElement(By.css('h1.hello'))
assert.equal(hello.getText(), 'Hello, world!')
})
})
的package.json:
{
"name": "foobar",
"version": "1.0.0",
"description": "",
"main": "index.js",
"devDependencies": {
"mocha": "^2.5.3"
"selenium-webdriver": "^2.53.2"
},
"scripts": {
"start": "http-server public",
"test": "mocha"
},
"author": "",
"license": "ISC"
}
我正在执行以下命令。
C:\Projects\foobar>npm install
因此,当我使用npm test
命令运行所有测试时,无论是否运行npm start
命令,它总是失败。
C:\Projects\foobar>npm test
> foobar@1.0.0 test C:\Projects\foobar
> mocha
Index page
1) should show hello greetings
0 passing (62ms)
1 failing
1) Index page should show hello greetings:
AssertionError: ManagedPromise {
flow_:
ControlFlow {
propagateUnhandledRejections_: true,
activeQueue_:
TaskQueue {
== 'Hello, world!'
at Context.<anonymous> (C:\Projects\foobar\test\test.js:22:16)
at callFn (C:\Projects\foobar\node_modules\mocha\lib\runnable.js:326:21)
at Test.Runnable.run (C:\Projects\foobar\node_modules\mocha\lib\runnable.js:319:7)
at Runner.runTest (C:\Projects\foobar\node_modules\mocha\lib\runner.js:422:10)
at C:\Projects\foobar\node_modules\mocha\lib\runner.js:528:12
at next (C:\Projects\foobar\node_modules\mocha\lib\runner.js:342:14)
at C:\Projects\foobar\node_modules\mocha\lib\runner.js:352:7
at next (C:\Projects\foobar\node_modules\mocha\lib\runner.js:284:14)
at Immediate._onImmediate(C:\Projects\foobar\node_modules\mocha\lib\runner.js:320:5)
npm ERR! Test failed. See above for more details.
我认为主要问题出在hello.getText()
代码段中。 getText()
方法无法获取 hello 元素的文本。
答案 0 :(得分:0)
大多数驱动程序操作都是异步的并返回一个promise,而不是该操作的实际返回值。在您的情况下,您应该更改findElement
,还要更改getText
以此方式工作。此外,您应该设置超时,因为默认设置为2000毫秒,大多数页面将不会完成加载。试试这个:
'use strict'
var assert = require('assert');
var webdriver = require('selenium-webdriver');
var By = webdriver.By;
var until = webdriver.until;
var driver;
before(function () {
driver = new webdriver.Builder()
.forBrowser('chrome')
.build();
});
describe('Index page', function () {
this.timeout(5000);
before(function () {
driver.get('http://localhost:8080/');
});
it('should show hello greetings', function (done) {
driver.findElement(By.css('h1.hello'))
.then(elem => elem.getText() )
.then(text => assert.equal(text, 'Hello, world!') )
.then(done);
});
});
请注意,箭头函数不定义自己的this
对象。您必须使用常规回调函数才能访问this.timeout
。无论如何,在mocha中不鼓励使用它们,请参阅following:
不鼓励将箭头功能传递给Mocha。他们对这个值的词汇绑定使他们无法访问Mocha上下文,以及像this.timeout(1000)这样的语句;不会在箭头功能内工作。