我一直在研究如何使用PhantomJS在网页上自动执行操作,但是我在操作页面以执行我想要的操作时遇到了问题。
我正在使用this as test site。我已经设法让Phantom打开网页并从#result范围中删除随机句子。但是现在我要做的是在没有重新启动脚本的情况下获得另一个句子。我不想关闭并重新打开页面,因为Phantom需要很长时间才能启动webkit并加载页面。所以我想我可以通过让Phantom单击句子框下方的“刷新”按钮来获得另一个句子。这就是我现在所拥有的:
var page = require('webpage').create();
console.log("connecting...");
page.open("http://watchout4snakes.com/wo4snakes/Random/RandomSentence", function(){
console.log('connected');
var content = page.content;
var phrase = page.evaluate(function() {
return document.getElementById("result").innerHTML;
});
console.log(phrase);
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
$("frmSentence").click();
});
});
var content = page.content;
var phrase = page.evaluate(function() {
return document.getElementById("result").innerHTML;
});
console.log(phrase);
phantom.exit();
});
正如您所看到的,我正在尝试使用.click()
函数单击刷新按钮,但这对我不起作用,因为我仍然得到与之前相同的句子。给出按钮的HTML:
<form action="/wo4snakes/Random/NewRandomSentence" id="frmSentence" method="post" novalidate="novalidate">
<p><input type="submit" value="Refresh"></p>
</form>
我不确定在要点击的脚本中我应该引用什么?我正在尝试使用表单ID“frmSentence”,但这不起作用。我想知道.click()
是否是正确的方法,Phantom是否有某种方式提交按钮链接的表单?或者也许我可以在获得句子的页面上运行相关的脚本?我在这一点上有点失落,所以我真的不知道应该采用哪种方法?
答案 0 :(得分:0)
网页报废是指将需求信息发送到网络服务器并获得结果。它不是表现得像用户点击按钮或输入搜索条件。
您在此示例中需要做的就是向http://watchout4snakes.com/wo4snakes/Random/NewRandomSentence发送POST请求。结果只是page.content
中的文本,甚至不需要评估。因此,要获得多个句子,您只需要执行page.open
答案 1 :(得分:0)
您的控制流有问题。 page.includeJs
是一个异步函数。如果您有其他语句page.includeJs
,则可能在加载脚本并执行回调之前执行它们。在你的情况下,你甚至在触发点击之前已经阅读了2次这句话。
如果你想多次这样做,我建议使用递归,因为你不能同步写这个。此外,由于您希望快速,因此您不能使用超时为1秒的静态setTimeout
,因为有时请求可能更快(您失去时间),有时更慢(您的脚本中断)。您应该使用waitFor
from the examples。
不是每次都加载jQuery,而是可以向上移动page.includeJs
并在其回调中包含其他所有内容。如果您只需要单击一个元素,或者如果jQuery click不起作用(是的,这种情况会不时发生),您应该使用PhantomJS; click an element。