使用Casperjs设置单选按钮

时间:2013-04-12 09:40:53

标签: radio-button casperjs

我尝试使用CasperJS设置单选按钮的值时没有成功。

有人可以向我解释为什么assertEval在这次测试中失败了吗?

    this.test.assertExist('input[name=main][value=yes]');

    casper.thenEvaluate(function(term) {
        document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
    });

    this.test.assertEval(function() {
        return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
    }, 'Main was set to true');

1 个答案:

答案 0 :(得分:3)

要理解为什么此断言失败,我们需要了解每次调用casper.then都会定义一个新的导航步骤,casper.run按照他们定义的顺序执行每一步。因此,casper.then块中的代码是异步回调。

如果您注释代码如下:

    this.test.assertExists('input[name=main][value=yes]');

    casper.then(function() {
        this.echo('Select the radio button');
        this.evaluate(function() {
            document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
        }
    });

    this.echo('Assert that the radio button is selected');
    this.test.assertEval(function() {
        return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
    }, 'Main was set to true');

你会注意到"断言选择了单选按钮"在&#34之前打印;选择单选按钮"。这就是你的问题!

解决方案:

如果您没有执行任何导航步骤,则可能不需要使用then。在这种情况下,您只需使用evaluate代替thenEvaluate。或者,如果您确实需要使用then,只需将assertEval放入同一casper.then块:

    this.test.assertExists('input[name=main][value=yes]');

    casper.then(function() {
        this.evaluate(function(term) {
            document.querySelector('input[name=main][value=yes]').setAttribute('checked', true);
        });
        this.test.assertEval(function() {
            return document.querySelector('input[name=main][value=yes]').getAttribute('checked') == "true";
        }, 'Main was set to true');
    });