Щелчок по ссылке с JavaScript в Mechanize

У меня есть это:

<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


person user1198316    schedule 20.04.2012    source источник


Ответы (3)


Это ссылка на javascript. Mechanize не сможет щелкнуть по нему, так как он не оценивает javascript. Извиняюсь!

Попробуйте выяснить, что происходит в вашем браузере, когда вы нажимаете на эту ссылку. Создает ли он запрос POST или GET? Какие параметры отправляются на сервер. Зная это, вы можете эмулировать то же самое действие в своем сценарии Mechanize. Инструменты разработчика Chrome / Firebug помогут.

Если это не сработает, попробуйте переключиться на библиотеку, которая поддерживает оценку javascript. Я успешно использовал watir-webdriver, но вы также можете попробовать phantomjs, casperjs, < href="http://nrabinowitz.github.io/pjscrape/" rel="nofollow">pjscrape или другие инструменты

person John Douthat    schedule 20.04.2012

Первые 2 должны были сработать, поэтому попробуйте это, распечатайте hrefs, чтобы убедиться, что это действительно так:

puts page.links.map(&:href)

Помните, что то, что вы видите его в своем браузере, не означает, что оно появится в ответе. Это могло быть отправлено как обновление ajax. Также вы можете просто сделать это, что я считаю более чистым:

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

Однако я не думаю, что нажатие на эту ссылку сделает то, что вы хотите, поскольку это javascript.

person pguardiario    schedule 20.04.2012

Вот способ справиться с этим. Предположим, что ваша страница возвращает этот контент:

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)
person JonB    schedule 02.10.2013