Как вставить строку в текстовое поле, используя mechanize в ruby? - PullRequest
1 голос
/ 21 июля 2011

Я знаю, что это очень простой вопрос, но я застрял на час, и я просто не могу понять, как это работает.

Мне нужно почистить кое-что из библиотеки моей школы, поэтому мне нужно вставить «CE» в текстовое поле, а затем нажать на ссылку с текстом «Clasificación». Выход - это то, что я собираюсь использовать для работы. Так вот мой код.

require 'rubygems'
require 'open-uri'
require 'nokogiri'
require 'mechanize'

url = 'http://biblio02.eld.edu.mx/janium-bin/busqueda_rapida.pl?Id=20110720161008#'
searchStr = 'CE'

agent = Mechanize.new
page = agent.get(url)

searchForm = page.form_with(:method => 'post')
searchForm['buscar'] = searchStr

clasificacionLink = page.link_with(:href => "javascript:onClick=set_index_and_submit(\'51\');").click
page = agent.submit(searchForm,clasificacionLink)

Когда я запускаю его, я получаю эту ошибку

janium.rb:31: undefined method `[]=' for nil:NilClass (NoMethodError)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 июля 2011

Я думаю, что ваша проблема на самом деле в строке 13, а не 31, и я даже скажу, почему я так думаю. Ваш скрипт не только не содержит 31 строки, но из тонкого руководства :

form_with (критерии)
Найдите критерии соответствия для одной формы.

На этой странице есть несколько форм с method="post". Очевидно, Mechanize возвращает nil, когда он не может точно соответствовать критериям form_with, включая часть single , упомянутую в документации; Итак, если ваш criteria соответствует более чем одной вещи, form_with возвращает nil вместо выбора одного из вариантов, и вы в конечном итоге пытаетесь сделать это:

nil['buscar'] = searchStr

Но nil не имеет []= метода, поэтому вы получите NoMethodError.

Если вы используете это:

searchForm = page.form_with(:name => 'forma')

Вы пройдете первую часть, так как на этой странице ровно одна форма с name="forma". Тогда у вас будут проблемы с этим:

clasificacionLink = page.link_with(:href => "javascript:onClick=set_index_and_submit(\'51\');").click
page = agent.submit(searchForm, clasificacionLink)

, поскольку Mechanize не знает, что делать с JavaScript (по крайней мере, мой не знает). Но если вы используете только это:

page = agent.submit(searchForm)

вы получите page, а затем сможете продолжить сборку и отладку вашего скрипта.

1 голос
/ 31 июля 2011

мю ответ звучит разумно. Я не уверен, если это строго необходимо, но вы также можете попытаться поставить скобки вокруг searchStr.

searchForm['buscar'] = [searchStr]
...