2014-09-26 74 views
0

我一直在寻找如何使用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()是正确的方式去做这件事,有没有什么方法幻影提交按钮链接到的形式?或者,也许我可以在获取该句子的页面上运行关联的脚本?我有点迷失在这一个,所以我不知道我应该去哪个方法?

回答

0

网络报废是关于将需要信息发送到Web服务器并获得结果。这与行为不像用户点击按钮或输入搜索条件无关。 您只需在本示例中发送POST请求至http://watchout4snakes.com/wo4snakes/Random/NewRandomSentence即可。结果只是page.content中的文字,它甚至不需要评估。因此,要获得多个句子,您只需执行一个循环即可。page.open

+0

感谢您的回答。我使用'page.open'的最初问题是需要很长的时间来连接和获取数据,我希望能够相对无缝地获得一个新句子。如果只是将POST发送到给定的地址,那么在页面仍然打开的情况下,是否可以使用Phantom自动执行此操作?或者正在发送'page.open'命令的POST部分? – kmahon99 2014-09-26 11:56:38

+0

如果你打开'NewRandomSentence',你可以尝试'page.reload()'。但是你可能需要测试可靠性。我每次用3个迷你步骤搜索100K +数据(搜索,到详细页面,下载报告),并且PhantomJS经常碰撞5次请求。更改后为每个请求做page.open它稍微更可靠,每次崩溃100个请求左右。也许这只是为了https而不是http我不确定。 – wayne 2014-09-26 12:24:11

0

您的控制流程有问题。 page.includeJs是一个异步功能。如果您还有其他一些语句page.includeJs,它们可能在加载脚本并执行回调之前执行。这意味着在你的情况下,你甚至在触发点击之前已经阅读了2次这个句子。

如果你想这样做多次,我建议使用递归,因为你不能同时写这个。另外,由于您希望这样做速度很快,因此有时请求可能会更快(您会失去时间),有时会更慢(脚本中断),因此您无法使用静态setTimeout超时1秒。您应该使用waitFor from the examples

而不是每次加载jQuery,您可以向上移动page.includeJs并在其回调中包含其他所有内容。如果你只需要点击一个元素,或者如果jQuery点击不起作用(是的,那会不时发生),你应该使用PhantomJS; click an element

相关问题