我一直在尝试编写一个从我的大学网站获取结果的脚本。有人建议我使用 Mechanize,它看起来确实很有希望。
为了获得结果,必须首先输入卷号,然后选择会话。使用 Mechanize 模拟第一部分很容易,但是在第二部分中我遇到了问题,因为它实际上是一个 JavaScriptonchange
事件。
我阅读了 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
谁能告诉我我做错了什么?