2017-08-10 82 views
0

我试图填写的表格中有一个文本框和发送按钮的HTML看起来像这样蟒蛇自动填写表单

<form class="form-horizontal"> 
         <div class="row"> 
          <div class="col-md-12"> 
           <div id="TextContainer" class="textarea-container"> 
            <textarea id="Text" rows="5" maxlength="700" class="form-control remove-border" style="background:none;"></textarea> 
           </div><button id="Send" class="btn btn-primary-outline" type="button" onclick="SendMessage()" style="margin-top:10px" data-loading-text="Loading..."><span class="icon icon-pencil"></span> Send</button> 
          </div> 
         </div> 
        </form> 

我试图用机械化来提交表单网页使用此代码

import re 
from mechanize import Browser 

br = Browser() 
response=br.open("https://abcd.com/") 
for f in br.forms(): 
    if f.attrs['class'] == 'form-horizontal': 
     br.form = f 
text = br.form.find_control(id="Text") 
text.value = "something" 
br.submit() 

该代码运行时没有错误,但没有提交正在发生,我该怎么做?

这里是SendMessage函数

function SendMessage() { 
    var text = $('#Text').val(); 
    var userId = $('#RecipientId').val(); 
    if (text.trim() === "") 
    { 
     $('#TextContainer').css('border-color', 'red'); 
    } 
    else if (new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_][email protected])?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(text)) 
    { 
     $('#TextContainer').css('border-color', 'red'); 
     $('#message').html("Links are not allowed in messages"); 
    } 
    else 
    { 
     $('#Send').button('loading'); 
     $.ajax(
     { 
      url: '/Messages/SendMessage', 
      type: 'POST', 
      cache: false, 
      data: 
      { 
       __RequestVerificationToken: $('<input name="__RequestVerificationToken" type="hidden" value="CfDJ8MQSRebrM95Pv2f7WNJmKQWGnVR66zie_VVqFsquOCZLDuYRRBPP1yzk_755VDntlD3u0L3P-YYR0-Aqqh1qIjd09HrBg8GNiN_AU48MMlrOtUKDyJyYCJrD918coQPG0dmgkLR3W85gV6P4zObdEMw" />').attr('value'), 
       userId: userId, 
       text: text 
      } 

     }); 
    } 

} 

回答

0

我怀疑的问题是,在HTML表单中的提交按钮的type=submit不是 - 所以机械化不会知道,当你调用br.submit()做什么。解决方法是要么改变HTML网页上的按钮类型,或告诉浏览器使用提交表单的按钮:

br.submit(type='button', id='Send') 

submit方法使用相同的参数HTML表单API,所以我建议采取请查看documentation了解更多详情。

更新

这里的问题似乎是附加到按钮的JavaScript方法。 Mechanize不支持调用JavaScript函数,因此您将无法仅使用.submit()方法提交表单。相反,最好的选择可能是读取SendMessage() JavaScript函数,如果有人点击发送按钮,该函数将被调用,并手动将其翻译为Python。在最好的情况下,它由一个简单的AJAX POST请求组成,这个请求在Python中很容易实现。有关相关问题,请拨打look here

第二次更新

鉴于你的问题新的信息,尤其是JavaScript函数,你现在可以手动执行您的Python脚本里面的POST请求。我建议使用Requests模块,这将使实现更容易。

import requests 

data = { 
    "__RequestVerificationToken": "CfDJ8MQSRebrM95Pv2f7WNJmKQWGnVR66zie_VVqFsquOCZLDuYRRBPP1yzk_755VDntlD3u0L3P-YYR0-Aqqh1qIjd09HrBg8GNiN_AU48MMlrOtUKDyJyYCJrD918coQPG0dmgkLR3W85gV6P4zObdEMw", 
    "userId": "something", 
    "text": "something else" 
} 

response = requests.post("https://example.com/Messages/SendMessage", data=data) 

response将由目前,你可以用它来检查请求是否成功做出响应。请注意,您可能需要用机械化读出__RequestVerificationToken,因为我怀疑它每次打开网站时都会生成。您可以用html_source = br.read()读出HTML源代码,然后搜索__RequestVerificationToken并尝试提取相应的值。

+0

它试图通过ID,即'br.submit(id =''')来试试这个错误'mechanize._form.ControlNotFoundError:没有控制匹配类型的'按钮',类'可点击',ID'发送'' – Eular

+0

发送')'看看是否有效? –

+0

显示相同的错误 – Eular