我在Mac OS X Yosemite上使用PhantomJS 2.0.0。
这实际上是两个独立但相关的问题:
WebPage.includeJs()
会返回任何内容吗?请参阅下面的代码了解相关我想在一个框架中包含jQuery,弄清楚框架中是否有一些元素,并相应地返回一个标志。page.evaluate()
?如果是这样,我可以在页面中同步包含jQuery,运行我的测试,并通过调用page.evaluate()
同步返回一个标志吗?这是代码(我意识到变量eventContentFound
实际上可能在两个不同的位置 - 一次在调用代码中,一次在框架内。我只是想解释我的想法希望将变量的frame实例中的值传递给调用父作用域。):
var eventContentFound = false;
for (var k = 0; k < window.frames.length; ++k) {
page.switchToChildFrame(k);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function() {
var eventHeaderFound = page.evaluate(function() {
var eventArr = $("tr.twSimpleTableHeadRow th[scope='col']").filter(function() { return $(this).text() == "Event"; });
return eventArr.length > 0;
});
if (eventHeaderFound) {
eventContentFound = true;
}
});
}
console.log("eventContentFound=" + eventContentFound);
如果我想做的事不能通过page.includeJs()
来完成,那么我怎么能完成同样的事呢?
答案 0 :(得分:0)
page.includeJs()
是异步的,因为它需要获取远程JavaScript文件。这就是为什么您的console.log("eventContentFound=" + eventContentFound);
代码始终会显示eventContentFound=false
。
您不需要使用jQuery来进行这样简单的查询。普通的JavaScript也有效:
var eventContentFound = false;
for (var k = 0; k < window.frames.length; ++k) {
page.switchToChildFrame(k);
var eventHeaderFound = page.evaluate(function() {
var eventArr = [].filter.call(document.querySelectorAll("tr.twSimpleTableHeadRow th[scope='col']", function(el) { return el.textContent.trim() == "Event"; });
return eventArr.length > 0;
});
if (eventHeaderFound) {
eventContentFound = true;
}
}
console.log("eventContentFound=" + eventContentFound);