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

标签 javascript iframe phantomjs

我在 Mac OS X Yosemite 上使用 PhantomJS。

逻辑很简单:

  1. 下载一些带有框架的 HTML 页面。
  2. 切换到每一帧,看看它是否包含一些 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() 切换回主/父框架。

关于javascript - 在 PhantomJS 中,page.switchToFrame(k) 是否需要延迟才能调用 page.evaluate() 来识别新框架的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32592683/

相关文章:

javascript - 无法理解函数的参数在特定代码段中如何工作

javascript - 如何在kendo-ui中默认显示占位符

javascript - 当 iframe 加载来自链接的内容时,滚动将与索引页面一起加载并消失

javascript - 在 iframe 中滚动时无法保持 div 固定

phantomjs - 在 PhantomJS 中禁用内容安全策略

javascript - 更改标签的属性值

Javascript 仅使用一个查询字符串刷新

UIWebView 中的 iOS iFrame 使用基本身份验证但没有弹出窗口显示?

java - 有什么方法可以使用 PhantomJSDriver 在 PhantomJS 中设置用户代理吗?

javascript - 如何在 PhantomJS 中滚动以触发延迟加载?