如何使用Mechanize提交javascript表单?

时间:2012-11-27 08:04:55

标签: javascript asp.net python mechanize

我有登录的机械化脚本。 登录后。页面在进入主登录页面之前首先显示重定向。

执行redirect()会将我带回登录页面。为什么呢?

执行login()会给我这个页面w / c是对的,但仍然需要继续到主页面。

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
     <form name="form1" method="post" action="tmp.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZCOgyU+AdP30f85W4DdUIV6LnCqa" />
</div>

      <script type="text/javascript">
          top.location.href = document.location.href;
          document.forms["form1"].submit();
      </script>
          &nbsp;&nbsp;</form>
      </body>
</html>

我真的不知道该做什么,因为我是新手。

如何使用我首次登录时提供的已经过身份验证的数据提交此类表单?

如何使用经过身份验证的用户提交更多POST数据?

到目前为止我的代码:

import re
import mechanize

login_url = 'login.aspx'

def login(id, username, password):
    br = mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    br.open(login_url)
    br.select_form(nr=0)
    br.form.set_all_readonly(False)
    br["__EVENTTARGET"] = "TransactBtn"
    br["AccountID"] = id
    br["UserName"] = username
    br["Password"] = password   
    response = br.submit()
    return response.geturl()
    #after submitting this it goes to the redirect portal page then to the main page

def redirect(url): 
    #after login we submit the redirect portal to see the main page
    br = mechanize.Browser()
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
    br.open(url)
    br.select_form(nr=0)
    response = br.submit()
    return response.read() #to the main

def dostuff():
    #this will submit some data as POST with the authenticated user.

print redirect(login('myid', 'myusername', 'mypassword'))

2 个答案:

答案 0 :(得分:3)

我认为你遇到了这个问题,因为你正在为任何请求创建新的机械实例。 Mechanise有点像浏览器,带有cookie存储等等。重新创建它的对象就像清除浏览器中的所有数据一样。

因此,您必须在所有请求中共享一个Browser类的实例。

login函数看起来像做你需要的,尝试打印br._ua_handlers['_cookies'].cookiejar以确保所有cookie都由服务器上的登录处理程序设置,然后使用相同的Browser实例来提取你需要的页面。

最重要的是我想创建一个类并将Browser设置为类变量。

class MyWorker(object):
    def __init__(self):
        self._br = mechanize.Browser()
        self._br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

    def login(self):
        self._br.open(login_url)
        self._br.select_form(nr=0)
        self._br.form.set_all_readonly(False)
        self._br["__EVENTTARGET"] = "TransactBtn"
        self._br["AccountID"] = id
        self._br["UserName"] = username
        self._br["Password"] = password   
        self._br.submit()

我可能是错的,但看起来这里的Javascript并不重要。

答案 1 :(得分:2)

Mechanize不支持javascript。 您应该查看Selenium,它与机械化几乎完全相同,但处理javascript。