我在Mac OS X Yosemite上使用PhantomJS。
逻辑很简单:
这是一段代码,我切换到每一帧:
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是及时提供的,因此网络延迟不是问题。
答案 0 :(得分:1)
不,page.switchToFrame()
是同步/立即。
我怀疑问题在于您是否尝试访问不存在的帧。一个接一个地调用switchToFrame()
两次将切换到主帧的子帧的子帧。您需要在迭代结束时使用page.switchToParentFrame()
切换回主/父框架。