0

问题:给定一个 aspx.net 页面,其提交是通过图像点击与提交按钮,我如何模拟被点击的图像以发布表单。

背景:我需要针对网站运行一些计划任务(我无法更改代码)。使用 RoboBrowser,我可以登录该站点并通常浏览页面。但是,我有一种情况,用户可以选择通过单击两个图像之一来打开/关闭某些东西。该表单有一个隐藏的提交按钮,可以自动注销用户(不知道为什么),所以我不能使用 browser.submit_form。我已经在 fiddler 中捕获了在图像点击时产生的流量,并且需要在代码中对其进行模拟,但我并不完全确定最好的方法。

系统:Python 3.4、RoboBrowser、基于旧 aspx.net 技术的网站

单击图像的HTML(注意,RainSwitch 仅验证是否进行了选择)

<input src="images\raindrop.jpg" name="imgRainSelect" type="image" id="imgRainSelect" onclick="return RainSwitch();">
<input src="images\sunsphere.jpg" name="imgAutoSelect" type="image" id="imgAutoSelect" onclick="return RainSwitch();">

在 Fiddler 上看到的POST

__EVENTARGUMENT 
__EVENTTARGET   
__EVENTVALIDATION   /wEWFwLD1ZzCCgKKvpK.........
__VIEWSTATE /wEPDwULLTEyODYzNjEw.........(really long)
__VIEWSTATEGENERATOR    59D0C8B1
imgAutoSelect.x 77
imgAutoSelect.y 77
rpt1$ctl00$chk  6224
rpt1$ctl00$DropDownListRainShutdownDays 0

一般想法

  • 感觉就像我应该能够以与用户相同的方式单击图像,但是 browser.follow_link 给了我一个类型错误,该对象不可下标。我假设是因为图像没有 a=href。
  • 我的下一个想法是,bro​​wser.open(url, method='post', data=data)我可以为数据制定大部分字段,但这是很多工作,我觉得因为这是一个常见的操作所以有必须是一种更简单的方法(我什至不确定它是否会起作用。)
  • 我不一定需要您为我编写代码,只要让我走上正轨即可。

谢谢,

史蒂夫·J

4

1 回答 1

0

我很想完全删除这个问题,因为它并没有引起太大的兴趣。但是,我在任何地方都找不到帮助,所以我认为有一天它可能会为某人节省很多工作(如果只有一个人的话)。

我最终不得不制定另一篇文章,并在数据中添加视图状态信息。

browser.open(url, method='post', data=self._get_form_post_data())

def _get_form_post_data(self):
    form = self.browser.get_form('Form1')
    view_state = form['__VIEWSTATE']
    generator = form['__VIEWSTATEGENERATOR']
    validation = form['__EVENTVALIDATION']
    data = dict(
        __EVENTTARGET="",
        __EVENTARGUMENT="",
        __VIEWSTATE=view_state.value,
        __VIEWSTATEGENERATOR=generator.value,
        __EVENTVALIDATION=validation.value,
    )
    data['rpt1$ctl00$chk'] = '6224'
    data['rpt1$ctl00$DropDownListRainShutdownDays'] = '0'
    return data

Fiddler 是一个很好的工具,可以帮助我找到需要发布的内容,firefox 的开发工具也是如此。

于 2017-06-21T01:55:39.753 回答