Обработка событий обмена Javascript с помощью Mechanize rubygem - PullRequest
1 голос
/ 09 июня 2011

Я пытался написать скрипт, который извлекает результаты с моего университетского сайта. Кто-то предложил мне использовать Mechanize, и это выглядит действительно многообещающе.

Чтобы получить результат, нужно сначала ввести номер броска, а затем выбрать сеанс. Имитация первой части была простой с Mechanize, но со второй у меня возникли проблемы, так как на самом деле это событие JavaScript onchange.

Я прочитал определение функции в JavaScript, и это то, что я придумал до сих пор. Mechanize не может обработать событие onchange, а также, когда я передаю значения, которые фактически изменены функцией JavaScript вручную, возвращается та же страница.

Вот код javaScript

function __doPostBack(eventTarget, eventArgument) {
        var theform;
        if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
            theform = document.Form1;
        }
        else {
            theform = document.forms["Form1"];
        }
        theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
        theform.__EVENTARGUMENT.value = eventArgument;
        theform.submit();
    }

Я установил точку останова в firebug и нашел значение __EVENTTARGET равным 'Dt1', тогда как __EVENTARGUMENT остается ''.

Сценарий ruby, который я написал для этого,

require 'mechanize'

#set up the agent to mimic firefox on windows
agent = Mechanize.new
agent.keep_alive = true
agent.user_agent = 'Windows Mozilla'

page = agent.get('http://www.nitt.edu/prm/nitreg/ShowRes.aspx')

#using mechanize to get us past the first form presented
result_form = page.form('Form1')
result_form.TextBox1 = '205110018'

page = agent.submit( result_form, result_form.buttons.first )

#the second hurdle that we encounter,
#here i'm trying to get past the JavaScript by doing what it does manually
result_form = page.form('Form1')
result_form.field_with('Dt1').options.find { |opt| opt.value == '66' }.select
result_form.field_with( :name => '__EVENTTARGET' ).value = 'Dt1'

#here i should have got the page with the results
page = agent.submit(result_form)
pp page

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

1 голос
/ 10 июня 2011

Похоже, у вас уже работает!Попробуйте использовать puts page.body вместо pp page, и вы увидите содержимое страницы.Вы можете использовать механизированные функции поиска для очистки данных со страницы.

Кроме того, вы можете упростить этот код до:

result_form['__EVENTTARGET'] = 'Dt1'
result_form['Dt1'] = '66'
...