在PhantomJS中,page.switchToFrame(k)是否需要延迟才能调用page.evaluate()来识

In PhantomJS, does page.switchToFrame(k) require a delay before a call to page.evaluate() would recognize the new frame's document?

本文关键字:page 延迟 调用 来识 evaluate switchToFrame PhantomJS 是否      更新时间:2023-09-26

我在Mac OS X Yosemite上使用PhantomJS。

逻辑很简单:

    下载带有框架的HTML页面
  1. 切换到每一帧,看看它是否包含一些HTML元素

下面是我切换到每一帧的代码片段:

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

出现在page.evaluate()函数(计算eventArr的地方)的第一行,经常导致这个错误:

TypeError: undefined is not a constructor (evaluating 'this.each(function(A,z){if(y.call(x,A,z)){w.push(A)}})')
  http://25livepub.collegenet.com/hash860B52FC5686DB189F1B18561705DAD0/scripts/prototype.js:2 in h
  phantomjs://webpage.evaluate():2
  phantomjs://webpage.evaluate():9

在插入一些日志指令(在页面上下文中,这些指令不写入处理标准输出)之后,这个错误有时会消失。在page.evaluate()上下文中帧document变量可用之前,是否可能在page.switchToFrame之后需要延迟?

一定发生了这样的事情。有时,这种逻辑行得通;其他时候则不然。我已经在浏览器中确认了资源/URL是及时提供的,所以网络延迟不是问题。

不,page.switchToFrame()为同步/立即。

我怀疑问题是你试图访问不存在的帧。一次接一次地调用switchToFrame()将切换到主框架的子框架的子框架。您需要在使用page.switchToParentFrame()的迭代结束时切换回主/父框架。