我有这个:
<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
答案 0 :(得分:13)
这是一个javascript链接。 Mechanize将无法单击它,因为它不会评估javascript。遗憾!
尝试查看点击该链接时浏览器中发生的情况。它是否创建POST或GET请求?发送到服务器的参数是什么。一旦您知道,您可以在Mechanize脚本中模拟相同的操作。 Chrome开发工具/ Firebug将提供帮助。
如果这不起作用,请尝试切换到支持javascript评估的库。我已经使用watir-webdriver取得了巨大的成功,但您也可以试用phantomjs,casperjs,pjscrape或其他工具
答案 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)