CasperJS点击无法显示模态窗口

时间:2015-02-02 15:28:37

标签: javascript phantomjs casperjs slimerjs

我正在尝试编写一个非常简单的CasperJS脚本来测试网站上的登录按钮。点击事件后,会在网站顶部打开一个模态窗口,以便您填写登录字段。

使用该网站,效果非常好。使用casperjs test my-script-file --engine=slimerjs也可以完美地运行。如果没有slimerjs,代码就会失败。

如何定义按钮:

<button class="btn btn-strong-submit" data-action="join">Join</button>

我的测试:

casper.test.begin('testing', 3, function suite(test)
{
    casper.start();
    casper.thenOpen("http://the-website-to-test-url", function()
    {
        casper.wait(5000, function(){
            casper.thenClick("button.btn.btn-strong-submit");
        });
    });

    casper.then(function () {
        casper.wait(3000);
        casper.capture("screen.png");
    });

    casper.then(function(){
        casper.assertVisible("div.join_container");
    });

    casper.run(function()
    {
        test.done();
    })
});

在网站上,单击按钮将转到http://the-website-to-test-url.com/#join,因为网站的工作方式是等待点击并捕获使用jQuery,然后找到[数据操作],表单#[数据 - 动作],然后以这种方式构建URL。

但CasperJS似乎并不理解一个点击,然后在后台从jQuery中捕获。有什么想法吗?

终端输出更新:

[info] [phantom] Starting...
[info] [phantom] Running suite: 4 steps
[debug] [phantom] opening url: http://www.MYURL.com/, HTTP GET
[debug] [phantom] Navigation requested: url=http://www.MYURL.com/, type=Other, willNavigate=true, isMainFrame=true
[debug] [phantom] url changed to "http://www.MYURL.com/"
[debug] [phantom] Successfully injected Casper client-side utilities
[info] [phantom] Step anonymous 2/4 http://www.MYURL.com/ (HTTP 200)
[info] [phantom] Step anonymous 2/4: done in 721ms.
[info] [phantom] Step anonymous 3/4 http://www.MYURL.com/ (HTTP 200)
[info] [phantom] Step anonymous 3/4: done in 731ms.
[info] [phantom] Step _step 4/5 http://www.MYURL.com/ (HTTP 200)
[info] [phantom] Step _step 4/5: done in 752ms.
[info] [phantom] wait() finished waiting for 5000ms.
[debug] [phantom] Mouse event 'mousedown' on selector: .btn.btn-strong-submit
[debug] [phantom] Mouse event 'mouseup' on selector: .btn.btn-strong-submit
[debug] [phantom] Mouse event 'click' on selector: .btn.btn-strong-submit
[info] [phantom] Step anonymous 5/5 http://www.MYURL.com/ (HTTP 200) 

//After click URL should have changed to http://www.MYURL.com/#login

[info] [phantom] Step anonymous 5/5: done in 5772ms.
[info] [phantom] Step _step 6/6 http://www.MYURL/ (HTTP 200)
[info] [phantom] Step _step 6/6: done in 5792ms.
[info] [phantom] wait() finished waiting for 3000ms.
[debug] [phantom] Capturing page to /home/TEMP/screen.png
[info] [phantom] Capture saved to /home/TEMP/screen.png
[info] [phantom] Done 6 steps in 9367ms

1 个答案:

答案 0 :(得分:1)

扩展Artjom的评论,我认为你应该改变这个:

casper.then(function () {
    casper.wait(3000);
    casper.capture("screen.png");
});

是:

casper.wait(3000, function () {
    casper.capture("screen.png");
});

这是一个更具描述性的,而不仅仅是更紧凑:“等待3000毫秒然后做......”。

(旁白:casper.then( doSomething )casper.wait(0, doSomething)是一回事。)

注意:这种方法的缺点是它会给你的单元测试增加3秒的延迟。您可以将其重写为:

casper.waitUntilVisible('div.join_container', {
    casper.capture("screen.png");
});

然后,只要它可见,它将截取屏幕截图,然后进入下一步。这种方式的缺点是你的断言总是有效;如果出现问题,您将获得超时而不是测试失败。 (这可能或不重要,取决于您正在测试的内容和原因。)