在断言时抛出Mocha和Selenium WebDriver错误

时间:2016-06-24 08:00:31

标签: node.js selenium

我使用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 元素的文本。

1 个答案:

答案 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)这样的语句;不会在箭头功能内工作。