单击Mechanize中的JavaScript链接

时间:2012-04-20 02:18:02

标签: ruby nokogiri mechanize-ruby

我有这个:

<a class="top_level_active" href="javascript:Submit('menu_home')">Account Summary</a>

我想点击该链接,但在使用link_to时出错。

我试过了:

bot.click(page.link_with(:href => /menu_home/))
bot.click(page.link_with(:class => 'top_level_active'))
bot.click(page.link_with(:href => /Account Summary/))

我得到的错误是: NoMethodError:未定义的方法`[]'为nil:NilClass

3 个答案:

答案 0 :(得分:13)

这是一个javascript链接。 Mechanize将无法单击它,因为它不会评估javascript。遗憾!

尝试查看点击该链接时浏览器中发生的情况。它是否创建POST或GET请求?发送到服务器的参数是什么。一旦您知道,您可以在Mechanize脚本中模拟相同的操作。 Chrome开发工具/ Firebug将提供帮助。

如果这不起作用,请尝试切换到支持javascript评估的库。我已经使用watir-webdriver取得了巨大的成功,但您也可以试用phantomjscasperjspjscrape或其他工具

答案 1 :(得分:1)

前2个应该有效,所以试试这个,打印出href以确保它真的存在:

puts page.links.map(&:href)

请记住,仅仅因为您可以在浏览器中看到它并不意味着它出现在响应中。它本可以作为ajax更新发送。 你也可以这样做我觉得更干净:

page.link_with(:href => /menu_home/).click

但是我不认为点击该链接会做你想要的,因为它是javascript。

答案 2 :(得分:0)

这是一种处理它的方法。假设您的页面返回此内容:

puts page.body
<HTML><SCRIPT LANGUAGE="JavaScript"><!--
     top.location="http://www.example.com/pages/myaccount/dashboard.aspx?";
// --></SCRIPT>
<NOSCRIPT>Javascript required.</NOSCRIPT></HTML>

我们知道它即将到来,所以我们知道要检查什么:

link_search = %r{top.location="([^"]+)"}
js_link = page.body.match(link_search)[1]
page = agent.get(js_link)