在PhantomJS中,page.includeJs()会返回任何内容吗?等效是否可以通过page.evaluate()同步完成?

时间:2015-09-14 16:54:00

标签: jquery phantomjs

我在Mac OS X Yosemite上使用PhantomJS 2.0.0。

这实际上是两个独立但相关的问题:

  1. WebPage.includeJs()会返回任何内容吗?请参阅下面的代码了解相关我想在一个框架中包含jQuery,弄清楚框架中是否有一些元素,并相应地返回一个标志。
  2. 同步调用page.evaluate()?如果是这样,我可以在页面中同步包含jQuery,运行我的测试,并通过调用page.evaluate()同步返回一个标志吗?
  3. 这是代码(我意识到变量eventContentFound实际上可能在两个不同的位置 - 一次在调用代码中,一次在框架内。我只是想解释我的想法希望将变量的frame实例中的值传递给调用父作用域。):

        var eventContentFound = false;
        for (var k = 0; k < window.frames.length; ++k) {
          page.switchToChildFrame(k);
          page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function() {
            var eventHeaderFound = page.evaluate(function() {
              var eventArr = $("tr.twSimpleTableHeadRow th[scope='col']").filter(function() { return $(this).text() == "Event"; });
              return eventArr.length > 0;
            });
    
            if (eventHeaderFound) {
              eventContentFound = true;
            }
          });
        }
        console.log("eventContentFound=" + eventContentFound);
    

    如果我想做的事不能通过page.includeJs()来完成,那么我怎么能完成同样的事呢?

1 个答案:

答案 0 :(得分:0)

page.includeJs()是异步的,因为它需要获取远程JavaScript文件。这就是为什么您的console.log("eventContentFound=" + eventContentFound);代码始终会显示eventContentFound=false

您不需要使用jQuery来进行这样简单的查询。普通的JavaScript也有效:

var eventContentFound = false;
for (var k = 0; k < window.frames.length; ++k) {
    page.switchToChildFrame(k);
    var eventHeaderFound = page.evaluate(function() {
      var eventArr = [].filter.call(document.querySelectorAll("tr.twSimpleTableHeadRow th[scope='col']", function(el) { return el.textContent.trim() == "Event"; });
      return eventArr.length > 0;
    });

    if (eventHeaderFound) {
      eventContentFound = true;
    }
}
console.log("eventContentFound=" + eventContentFound);