我在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()
的迭代结束时切换回主/父框架。