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