5

我有这个:

<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: undefined method `[]' for nil:NilClass

4

3 回答 3

13

那是一个javascript链接。Mechanize 将无法单击它,因为它不评估 javascript。对不起!

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

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

于 2012-04-20T11:17:32.827 回答
1

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

puts page.links.map(&:href)

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

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

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

于 2012-04-20T03:07:28.317 回答
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)
于 2013-10-02T22:40:49.160 回答