如何暂停或等待在摩卡testing案例 – setTimeout不工作

我build了一个selenium摩卡testing用例打开谷歌,input一些文本,然后单击search。 这是我的selenium摩卡testing用例代码片段

但是我只需要在inputsearch文本60秒后执行点击search

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只是通过testing用例而不执行超时内的代码

任何人都可以build议一个更好的解决scheme,这个或任何其他API可用于暂停摩卡testing

 Google Search √ Enter element to be searched (7771ms) √ Click search button 2 passing (8s) 

有一点需要注意的是,

  1. 你不需要done你传递给test.it的函数。 您正在使用selenium-webdriver包装摩卡function,这使得所有的testing是asynchronous的。 这样done是没用的。

  2. 你的第二个testing是依赖于第一个。 这是不好的devise。 testing应该是独立的。 对于如何独立进行testing,已经有了一些问题,所以我不打算在这里重新解决这个问题。

在这里你的等待问题是你如何解决它。 你可以修改你的第二个testing是这样的:

 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'; }); }); }); 

它所做的是创build一个控制stream,在其中执行一个承诺。 webdriver.promise.delayed只是创build一个承诺 ,将在传递给函数的毫秒数中解决。 然后你可以在browser上调用方法。 最终效果是暂停浏览器上的操作30秒。

你的代码的另一个问题是,它不等待标题改变。 当点击发生时,标题改变需要一点时间,所以Selenium代码必须等待,因此最后是browser.wait调用。 如果标题永远不会改变,那么testing将会失败并且超时。