单击链接不会刷新内容

时间:2014-09-26 11:22:08

标签: javascript html automation phantomjs bots

我一直在研究如何使用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是否有某种方式提交按钮链接的表单?或者也许我可以在获得句子的页面上运行相关的脚本?我在这一点上有点失落,所以我真的不知道应该采用哪种方法?

2 个答案:

答案 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