javascript - 如何使用 CasperJS 提交列表中的项目

标签 javascript phantomjs automated-tests casperjs spookyjs

我正在尝试在网格中进行迭代,其中每行都有一个操作链接按钮。我需要单击此按钮并返回网格并单击下一行的按钮。

查看 CasperJS 脚本:

for(var i=1; i<lines.length; i++) {

    var element = this.getElementInfo(x('//*[@id="elx"]/tbody/tr[' + i +']/td[1]'));
    var item = x('//*[@id="gdvConsulta"]/tbody/tr[' + i +']/td[3]/a');

    var model = {
        'custom': element.text,
        'item': item.text
    };

    // Click on item
    casper.click(item);
    this.waitForSelector(x('//*[@id="grid"]'),
        function pass () {
            utils.dump('ok');
            var backbutton = x('//*[@id="back"]/a');

            casper.click(backbutton);
        },
        function fail () {
            utils.dump('error');
        }
    );

    utils.dump('done line');
}

注意:在单击我的第一次循环迭代之前,已为所有行打印消息“done line”。

如何在不进行下一次迭代的情况下创建真正的waitForSelector()

最佳答案

您不恰本地混合了同步和异步函数。您可以使用循环,因为您事先知道迭代次数,但问题可能是您在第一个 waitForSelector() 步骤之前单击每个 item已执行。

所有 then*()wait*() 函数都是异步步骤函数。通过调用它们,您可以安排在当前步骤之后执行的步骤。您需要将同步代码包装在如下步骤中:

for(var i=1; i<lines.length; i++) {
    (function(i){
        casper.then(function(){
            var element = this.getElementInfo(x('//*[@id="elx"]/tbody/tr[' + i +']/td[1]'));
            var item = x('//*[@id="gdvConsulta"]/tbody/tr[' + i +']/td[3]/a');

            // Click on item
            casper.click(item);
        });


        casper.waitForSelector(x('//*[@id="grid"]'),
            function pass () {
                utils.dump('ok');
                var backbutton = x('//*[@id="back"]/a');

                casper.click(backbutton);
                utils.dump('done line');
            },
            function fail () {
                utils.dump('error');
            }
        );
    })(i);
}

请注意,您需要将循环中的 i 变量括起来,因为循环内部是异步执行的,并且 i 引用了all 迭代将指向最后一个可能的 i。在这里查看更多:JavaScript closure inside loops – simple practical example

关于javascript - 如何使用 CasperJS 提交列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31592714/

相关文章:

javascript - 为什么我的 Knockout Radio 按钮在另一个具有点击绑定(bind)的元素中时会失败?

javascript - 使用 PhantomJS 运行 TypeScript 文件

testing - 使用 TestCafe 和 Electron,有没有办法在最后一次测试之后但在应用程序关闭之前执行脚本?

selenium - 如何使用 Selenium IDE 处理 React Select 组件?

javascript - 使用 vb.net,我可以将此字符串转换为正则表达式吗?

javascript - 将 SVG 路径转换为多边形以便在 Javascript Clipper 中使用

java - 如果有 flash 插件,phantomjs 无法加载页面

google-chrome - 如何使用 Chrome 远程调试 CasperJS?

user-interface - OpenGL 应用程序的自动化测试

javascript - 在 jQuery 滚动条上淡入淡出 div