使用Mechanize登录网站 - 挖掘组织的用户表单

时间:2014-05-02 02:12:44

标签: python mechanize form-submit

我正在尝试使用机械化登录我认为编码不佳的网站,我正面临一些问题。

网站表格如下:

              <tr>
                <td align="left" valign="middle" class="style3">User name </td>

                <td height="22" colspan="2" align="right" valign="middle"><input name="someLongCrap_UserName" type="text" id="someLongCrap2_UserName" class="inputborder" onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById(&#39;imgSubmit&#39;).focus().click();}};" /></td> 
              </tr>
              <tr>
                <td align="left" valign="middle" class="style3">Password</td>
                <td height="22" colspan="2" align="right" valign="middle"><input name="someLongCrap_Password" type="password" id="someLongCrap2_Password" class="inputborder" onkeydown="javascript:if (event.which || event.keyCode){if ((event.which == 13) || (event.keyCode == 13)) {document.getElementById(&#39;imgSubmit&#39;).focus().click();}};" /></td>
                </tr>
              <tr>
                <td rowspan="2" align="left" valign="middle">&nbsp;</td>

                <td rowspan="2" align="right" valign="bottom">
                    <a id="abcDef">
                    <input type="image" name="imgSubmit1" id="imgSubmit2"  alt="Submit" /></a>
                </td>
              </tr>

我尝试过以下不同的迭代:

        from mechanize import Browser

        br = Browser()
        br.open("http://www.mysite.com")

        user = br.select_form("someLongCrap_UserName") ;
        user.set_value='myUserName';

        passw = br.select_form("someLongCrap_Password") 
        passw.set_value='myPassword';

我收到以下类型的错误: mechanize._mechanize.FormNotFoundError: no form matching name 'someLongCrap_UserName'

我希望更熟悉机械化的人可以告诉我我做错了什么。

此外,我最终还希望登录,所以我想“点击”(通过机械化)登录“提交”按钮(name =“imgSubmit1”)。

感谢您提出任何指示


运行

                for form in br.forms():
                    print form
                    print '-------------'

我在表格列表中得到这些:           <TextControl(someLongCrap_UserName=)>           <PasswordControl(someLongCrap_Password=)>

但是当我转到.select_form(nr=x)时,对于x&gt; 0我收到错误。         br.select_form(nr=0)

如果x = 1;                 mechanize._mechanize.FormNotFoundError: no form matching nr 1

2 个答案:

答案 0 :(得分:0)

使用索引选择所需的表单

像这样。第一次

for form in br.forms():
    print form

找出您的表单是哪个索引。即0 1 2等

然后尝试

br.select.form(nr=1) #for the second form on the page for example

如果您需要获取文本输入的控件名称,请执行...

print br.form.controls

然后:

br.form['someLongCrap_UserName']='username'
br.form['someLongCrap_Password']='password'
br.submit()

答案 1 :(得分:0)

我不会接受我的回答,因为它不是&#34;正确的&#34;答案给出了我提供的提示,但selenium是一个很棒的解决方案,可以完全满足我的需求。我认为使用这种机械化可能会有一些速度降低,但我需要进行测试(并且没有一个可行的机械化解决方案使这很难)。

无论如何,根据我的需要,以下通用代码应该适合您:

            from selenium import webdriver

            from selenium.webdriver.common.by import By
            from selenium.webdriver.support.ui import Select
            from selenium.common.exceptions import NoSuchElementException
            from selenium.webdriver.common.keys import Keys


            baseurl = "http://myurl.com";

            username = "myUserName"
            password = "myPassword"



            mydriver = webdriver.Firefox()
            mydriver.get(baseurl)
            mydriver.maximize_window()

            inputElement = mydriver.find_element_by_id("userNameInputBox")
            inputElement.send_keys(username)

            inputElement = mydriver.find_element_by_id("passWordInputBox");
            inputElement.send_keys(password);

            inputElement = mydriver.find_element_by_id("mySubmitButton");
            inputElement.click();