如何在mocha测试用例中暂停或等待 - setTimeout无法正常工作

时间:2014-10-30 12:06:27

标签: node.js selenium-webdriver settimeout mocha

我建立了一个selenium-mocha测试用例来打开谷歌,输入一些文本并点击搜索。 这是我的selenium-mocha测试用例代码段

但我需要在输入搜索文本

后60秒内执行点击搜索
   var assert = require('assert'),
       test = require('selenium-webdriver/testing'), 
       webdriver = require('selenium-webdriver');
   var urladd ='http://www.google.com/';

   function clickLink(link){
      link.click();
      return link;
   }

  var testSimple=function(searchContent){
    var browser = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build();
    test.describe('\n\nGoogle Search\n', function() {
      this.timeout(60000);
      test.it('Enter element to be searched', function(done) {
        browser.get(urladd);
        browser.findElement(webdriver.By.name('q')).sendKeys(searchContent);
        browser.getTitle().then(function(title) {
          assert.equal(title,'Google');
        })
      });

      test.it('Click search button', function(done) {
        setTimeout(function(){
            browser.findElement(webdriver.By.name('btnG')).then(clickLink).then(function(){
            browser.getTitle().then(function(title) {
            assert.equal(title,'selenium mocha test cases - Google Search');
          });
        });
        },30000);
      });   
    });
  }

  testSimple('selenium mocha test cases');

我使用setTimeout暂停60秒但是,mocha只是通过测试用例而不执行超时内的代码

是否有人可以为此或任何其他可用于暂停mocha测试的API建议更好的解决方案

Google Search

  √ Enter element to be searched (7771ms)
  √ Click search button

2 passing (8s)

1 个答案:

答案 0 :(得分:1)

在谈到此事之前,有几点注意事项:

  1. 您传递给done的函数不需要test.it。您正在使用selenium-webdriver包装的Mocha函数,这使得所有测试都是异步的。所以done没用。

  2. 您的第二次测试取决于第一次测试。这是糟糕的设计。测试应该是独立的。关于如何使测试独立的问题已经有了问题,所以我不打算在这里再次解决这个问题。

  3. 这里的等待问题是你如何解决它。您可以将第二个测试修改为:

    test.it('Click search button', function() {
        var flow = webdriver.promise.controlFlow();
        flow.execute(
            function () { return webdriver.promise.delayed(30 * 1000); });
        browser.findElement(webdriver.By.name('btnG')).then(clickLink);
        browser.wait(function () {
            return browser.getTitle().then(function (title) {
                return title === 'selenium mocha test cases - Google Search';
            });
        });
    });
    

    这样做是创建一个执行承诺的control flowwebdriver.promise.delayed只创建一个promise,它将以传递给函数的毫秒数来解析。然后你可以在browser上调用方法。最终效果是暂停浏览器上的操作30秒。

    您的代码的另一个问题是,等待标题无法更改。当点击发生时,标题需要更改,因此Selenium代码必须等待,因此最后调用browser.wait。如果标题永远不会更改,则测试将因超时而失败。