2010-04-01 214 views
2

我尝试通过Mechanize提交表单,但是,我不确定如何添加由某些Javascript完成的必要表单贵重物品。由于Mechanize不支持Javascript,所以我尝试手动添加变量。机械化Javascript

形式来源:

<form name="aspnetForm" method="post" action="list.aspx" language="javascript" onkeypress="javascript:return WebForm_FireDefaultButton(event, '_ctl0_ContentPlaceHolder1_cmdSearch')" id="aspnetForm"> 

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/..." /> 

<script type="text/javascript"> 
<!-- 
var theForm = document.forms['aspnetForm']; 
if (!theForm) { 
    theForm = document.aspnetForm; 
} 
function __doPostBack(eventTarget, eventArgument) { 
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
     theForm.__EVENTTARGET.value = eventTarget; 
     theForm.__EVENTARGUMENT.value = eventArgument; 
     theForm.submit(); 
    } 
} 
// --> 
</script> 

<script language="javascript"> 
<!-- 
var _linkpostbackhit = 0; 
function _linkedClicked(id, key, str, a, b) { 
    if (!b || !_linkpostbackhit) { 
     if (!a) { 
      __doPostBack(key, id); 
      _linkpostbackhit = 1; 
     } else { 
      if (window.confirm(str)) { 
       __doPostBack(key, id); 
       _linkpostbackhit = 1; 
      } 
     } 
    } 
    return void(0); 
} 
// --> 
</script> 

... 

<a href="JavaScript:_linkedClicked('123456','_ctl0:ContentPlaceHolder1:Link', '',0,1);">123456</a> 

... 

</form> 

我尝试添加了2个变量:

page.forms.first['__EVENTTARGET'] = '_ctl0:ContentPlaceHolder1:Link' 
page.forms.first['__EVENTARUGMENT'] = '123456' 

,并提交形式:

page.forms.first.click_button(page.forms.first.buttons.first) 

返回结果只(重)秀当前的链接列表,就好像我没有点击任何链接。

任何帮助将不胜感激。谢谢!

回答

2

当面对这个问题时,我通常使用Firefox和Firebug来了解请求是如何做出的。使用“网络”选项卡,您将能够看到“list.aspx”及其所有参数的请求。

2
page.forms.first['__EVENTARUGMENT'] = '123456' // -> should be '__EVENTARGUMENT' 
5

使用机械化-1.0.0以下工作:

agent = Mechanize.new 
page = agent.get('http://127.0.0.1/some.aspx') 

form = page.form("aspnetForm") 
form.add_field!('__EVENTARGUMENT', 'Page$2') 
form.add_field!('__EVENTTARGET', 'ctl00$ContentPlaceHolder1$gvwSomeList') 
page = agent.submit(form) # this gets page 2 
+0

DUDE!你回答救了我的屁股!我随时都要给你一瓶啤酒!谢谢一堆。 – jlstr 2012-11-01 21:50:22