0

我正在使用 mocha、selenium 和 chai 进行一些测试驱动的开发,我是这些库的初学者,我问我是否已经做对了?这是我的一段functional_tests.js

test.it('Hamid visits the first page of tests', function(){
    // Hamid visits the home page of the test plateform he heard about
    driver.get('file:///home/marouane/Projects/iframe_test/test_template.html') ;

    // he noticed the title and the header of the page mention Test Template
    driver.getTitle().then(function(title){
        expect(title).to.contain('Test Template');
    });

    driver.findElement(webdriver.By.tagName('h1')).then(function(element){
        expect(element).to.contain('Test Template');
    });
    // he is invited to enter a URL for the page he wants to test
    driver.findElement(webdriver.By.id('input-url'), function(element){
         expect(element).to.equal('Enter a url');
    });

这是我测试的html页面:

<!DOCTYPE html>
<html>
<head>
    <title>Test Template</title>
</head>
<body>
<h1></h1>
</body>
</html>

我期待在第二个chai 期望上得到一个断言错误,但我以这个错误结束:

NoSuchElementError: 无法定位元素:{"method":"id","selector":"input-url"}。

可能是我做错了什么,并且回调函数被推迟了。

4

1 回答 1

0

我不是在这里组织运行您的代码,但是通过检查您的代码,我认为有两个问题:

  1. 回调中的代码it是异步的,但您不使用done回调来指示测试已完成。尽管使用 WebDriverJS 的 promise 风格使它看起来更像同步代码,并且“控制流”(这是 WebDriverJS 的术语)也使异步代码看起来是同步的,但事实仍然是使用 WebDriverJS 本质上是异步的。

  2. 您混合了两种不同风格的调用 WebDriverJS 函数。也就是说,你混合了承诺和延续。您对driver.get,driver.getTitle的调用和第一次调用driver.findElement都使用了 Promise(显式或隐式)。但是,最后一次调用driver.findElement使用的是延续而不是承诺。所以第一个调用使用控制流设施,但最后一个没有。最后一个不能使用控制流工具,因为这个工具只管理承诺,而你的 lass 调用使用的是延续而不是承诺。因此,您的expect调用不会按照您认为的顺序执行。

这样的事情应该可以解决我上面提到的问题:

test.it('Hamid visits the first page of tests', function(done){
    // Hamid visits the home page of the test plateform he heard about
    driver.get('file:///home/marouane/Projects/iframe_test/test_template.html') ;

    // he noticed the title and the header of the page mention Test Template
    driver.getTitle().then(function(title){
        expect(title).to.contain('Test Template');
    });

    driver.findElement(webdriver.By.tagName('h1')).then(function(element){
        expect(element).to.contain('Test Template');
    });

    // he is invited to enter a URL for the page he wants to test
    driver.findElement(webdriver.By.id('input-url')).then(function(element){
         expect(element).to.equal('Enter a url');
         done();
    });
});

只有两个变化:

  1. 我已将done参数添加到it(第一行)done()的回调中,并在包含您的最后一个回调中添加了一个调用expect

  2. 我已将最后一次调用更改为driver.findElement使用承诺而不是延续的调用。

于 2013-12-26T17:43:50.623 回答