Phantom.js - 在警报框内获取文本

时间:2013-11-06 21:06:25

标签: javascript jquery testing phantomjs

是否可以使用Phantom.js将文本放入警报框?

var page = require("webpage").create()
, assert = require("assert");

page.open("http://www.mysite.com/page", function (status) {
  page.includeJs("jquery-1.10.2.min.js", function () {
    var alertText = page.evaluate(function () {
      //This should cause an alert dialog to appear
      $('button[type="submit"]').click();

      //This doesn't work, but is there some equivalent to this?
      return $("alert").val();
    });

    assert.equal(alertText, "Thanks for clicking Submit!");
  });
});

1 个答案:

答案 0 :(得分:1)

无法以alert方式获取消息(没有名为<alert>的HTML元素,这是您尝试使用jQuery查找的内容)。但是,您可以做的是重新定义window.alert以执行其他操作,例如登录到控制台。然后,您可以使用onConsoleMessage查看控制台消息。要将其与您可以获得的其他控制台消息区分开来,您可以为其指定唯一的前缀。在这种情况下我使用了ALERT:

page.evaluate(function() {
    window.alert = function(str) {
        console.log("ALERT:" + str);
    }
});

page.onConsoleMessage(function(message, lineNumber, sourceId) {
    if(/^ALERT:/.test(message)) {
       //do something with message
    }
});

如果您不想使用onConsoleMessage路线,可以创建自己的隐藏input元素(在重新定义的alert中),然后只需查询该值:

page.evaluate(function() {
    window.alert = function(str) {
        if(jQuery("#alertText").length === 0) {
            jQuery("body").append(jQuery("<input>").attr("id", "alertText").attr("text", "hidden");
        }

        jQuery("#alertText").val(str);
    }
});

然后在您的代码中,您将执行jQuery("alert").val()而不是jQuery("#alertText").val()