在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?
我在Mac OS X Yosemite上使用PhantomJS。
逻辑很简单:
- 下载带有框架的HTML页面
- 切换到每一帧,看看它是否包含一些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()
的迭代结束时切换回主/父框架。
相关文章:
- 可以简化嵌套的延迟Q Promises解析吗
- onclick函数需要双击,因为类分配延迟
- 更多延迟动画
- 对父作用域的指令更新延迟了一步
- 为JS函数添加延迟
- 带有延迟的循环每次应运行5次
- 关键帧之间的css3动画延迟
- 如何在有延迟的情况下对两个代码进行积分
- 如何为.css状态的更改添加延迟
- cpu:phantom:page的比例可以大于1:1:1吗
- Angular.js延迟控制器初始化
- 如何在不使用Page.Theme属性的情况下设置页面样式和主题
- 在延迟时设置Whois脚本
- 如何在Javascript中延迟setInterval
- 如何在一个元素动画之后延迟
- 如何将一个方法延迟到另一个方法首先完成,javascript
- jQuery延迟了ajax调用的循环
- 在page.open()-PhantomJS中无法访问全局变量
- 如何减少在移动网络应用程序上播放声音的延迟
- 在PhantomJS中,page.switchToFrame(k)是否需要延迟才能调用page.evaluate()来识