从 webdriver.io 获取数据后动态构建 Mocha 测试

Posted

技术标签:

【中文标题】从 webdriver.io 获取数据后动态构建 Mocha 测试【英文标题】:Build Mocha test dynamically after getting data from webdriver.io 【发布时间】:2016-03-04 05:36:23 【问题描述】:

我正在寻找一种在异步获取数据后定义 Mocha 测试的解决方案。

目前,我使用gulp-webdriver 来使用 Selenium 获取 html 内容。 我想测试某些 HTML 标签结构。

例如,我想从 HTML 页面中获取所有按钮结构。

1° 在 Mocha Before() 中,我得到按钮:

var buttons = browser.url("url").getHTML("button");

2° 之后,我想在单独的it 中测试每个按钮:

buttons.forEach(function(button)   it() ); 

找到的唯一解决方案是在使用 data_driven 或 leche.withData 插件启动 Mocha 测试之前使用 Gulp 加载 HTML 和提取按钮。

您知道直接在 Mocha 测试定义中的另一种解决方案吗?

提前致谢,

【问题讨论】:

【参考方案1】:

似乎不可能用 mocha 动态创建 it() 测试。

我终于像这样组织我的测试了:

it('Check if all tag have attribute', function() 
        var errors = [];
        elements.forEach(function(element, index, array) 
            var $ = cheerio.load(element);
            var tag = $(tagName);
            if (tag.length) 
                if (!tag.attr(tagAttr)) errors.push(element);
            
        );
        expect(errors).to.be.empty;
    

【讨论】:

【参考方案2】:

如果您不介意滥用 before() 钩子,您实际上可以使用 mocha 创建动态 It() 测试:

before(function () 
    console.log('Let the abuse begin...');
    return promiseFn().
        then(function (testSuite) 
            describe('here are some dynamic It() tests', function () 
                testSuite.specs.forEach(function (spec) 
                    it(spec.description, function () 
                        var actualResult = runMyTest(spec);
                        assert.equal(actualResult, spec.expectedResult);
                    );
                );
            );
        );
);

it('This is a required placeholder to allow before() to work', function () 
    console.log('Mocha should not require this hack IMHO');
);

【讨论】:

什么是 promiseFn() 在这种情况下? @Wexoni promiseFn() 代表您在动态生成测试之前需要执行的任何基于 Promise 的异步操作。 OP 想要“在异步获取数据后定义 Mocha 测试”,因此在异步数据准备就绪时完成的根级 before 回调中返回一个 javascript 承诺就可以了。否则,您将仅限于同步操作。 恐怕我不明白 :(。我有一个 Main 测试,它调用另一个 Helper 文件,并在其中生成了一些其他测试。主测试运行,如果还有其他测试在帮助文件中生成,它们被返回并返回到 Main,我也需要符文它们。我该如何实现?我在 SO 上提出了一个问题。***.com/questions/42508514/… 参见--delay 标志你正在尝试做的事情,而不是假的-it hack:github.com/mochajs/mocha/issues/2221#issuecomment-214636042 @Kev 除了作为标志而不是代码的一部分之外,--delay 还强制您在代码中选择一个入口点来调用它们的全局 run() 函数。我的方法是让你任意初始化任何或所有测试文件,并在代码本身中完成。【参考方案3】:

Mocha 支持两种方法来处理测试中的异步性。一种方法是使用 done 回调。 Mocha 将尝试将一个函数传递给您的所有its、befores 等。如果您接受done 回调,则您有责任在异步操作完成时调用它。 回调样式:

before(function(done)  
    browser.url("url").getHTML("button").then(function() 
        done();
    ); 
); 

另一种方法是使用 Promises。由于您对 getHTML 的调用返回了一个 Promise,因此您只需返回该 Promise,Mocha 就会知道在继续执行任何操作之前等待该 Promise 解决。

这是 Promise 样式的示例:

before(function()  
    return browser.url("url").getHTML("button"); 
); 

对此有几点值得注意: - getHtml() 返回对 html 按钮的承诺。每当对getHTML 的异步调用完成时,传递给then 函数的函数就会被调用,并且对getHTML 的调用的结果值会被传入。 - 在之前返回那个承诺让 mocha 知道你正在做一些异步的事情。 Mocha 将等待该承诺达成,然后再超越您的“之前”。

对于您的具体示例,您可能想尝试如下:

describe('the buttons', function() 
   var buttons;

   before(function()  
       return browser.url("url").getHTML("button").then(function(result)  
            buttons = result;  
        ; 
   ); 

   it('does something', function() 
     buttons.forEach(function(button)   
     ); 
   ); 

);

【讨论】:

感谢您的完整回答,但我想做的是使用按钮结果创建it 测试。类似的东西:buttons.forEach(function(button) it('does something', function() ); );

以上是关于从 webdriver.io 获取数据后动态构建 Mocha 测试的主要内容,如果未能解决你的问题,请参考以下文章

webdriver.io 无法为 iframe 禁用同源策略

npm 错误!代码 ELIFECYCLE - 从 jenkins 运行 webdriver IO 测试

ajax异步获取数据后动态向构建表格并添加数据

如何等待 WEBdriver.io 的 Ajax 调用完成

当窗口在 Chrome 87 的后台时,Webdriver.io/Selenium 测试失败

在构建发布 apk 后,我的颤振应用程序没有从 http 获取数据 [重复]