在PhantomJS中,page.switchToFrame(k)在调用page.evaluate()之前是否需要延迟才能识别新框架的文档?

时间:2015-09-15 17:59:38

标签: javascript iframe phantomjs

我在Mac OS X Yosemite上使用PhantomJS。

逻辑很简单:

  1. 下载一些带框架的HTML页面。
  2. 切换到每个框架并查明它是否包含某些HTML元素。
  3. 这是一段代码,我切换到每一帧:

      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.switchToFrame上下文中有document个变量可用之前,是否可能需要page.evaluate()之后的延迟?

    必须发生这样的事情。有时,逻辑有效;其他时候没有。我已经在浏览器中确认资源/ URL是及时提供的,因此网络延迟不是问题。

1 个答案:

答案 0 :(得分:1)

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

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