3

我试图用 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');
4

1 回答 1

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

您会注意到在“选择单选按钮”之前打印了“断言已选择单选按钮”。所以有你的问题!

解决方案:

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');
    });
于 2013-04-21T22:20:16.590 回答