我有一个用python编写的机械化脚本,它填写了一个Web表单,并且应该点击"创建"按钮.但是有一个问题,表单有两个按钮.一个用于"添加附件",另一个用于"创建".两者都是"提交"类型,附加按钮是列出的第一个.因此,当我选择论坛并执行br.submit()时,它会点击"附加"按钮而不是"创建".广泛的谷歌搜索对于选择表单中的特定按钮没有任何帮助.有没有人知道跳过第一个"提交"按钮并点击第二个的任何方法?
Chi*_*ael 21
我尝试使用nr参数,没有任何运气.
我能够使用名称和标签参数的组合来使用它,其中"label"似乎对应于HTML中的"值":
这是我的两个提交按钮:
<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" />
Run Code Online (Sandbox Code Playgroud)
...这里是点击第一个,返回,然后点击第二个的代码:
from mechanize import Browser
self.br = Browser()
self.br.open('http://foo.com/path/to/page.html')
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Foo'
submit_response = self.br.submit(name='Preview', label='Preview')
self.br.back()
self.br.select_form(name='my_form')
self.br['somefieldname'] = 'Bar'
submit_response = self.br.submit(name='Create', label='Create New Page')
Run Code Online (Sandbox Code Playgroud)
有一个变体也适用于我,其中提交按钮的"名称"是相同的,例如:
<input type="submit" name="action" value="Preview" />
<input type="submit" name="action" value="Save" />
<input type="submit" name="action" value="Cancel" />
Run Code Online (Sandbox Code Playgroud)
和
self.br.select_form(name='my_form')
submit_response = self.br.submit(name='action', label='Preview')
self.br.back()
submit_response = self.br.submit(name='action', label='Save')
Run Code Online (Sandbox Code Playgroud)
重要说明 - 我只能在清理页面其余部分的一些HTML 后才能获得任何这种多提交按钮代码.
具体来说,我不可能<br/>
- 而是我必须<br />
......而且,更不经常,我在两个提交按钮之间没有任何东西.
让我感到沮丧的是,我在两个多小时内搜寻的机械化/ ClientForm错误归结为:
<tr><td colspan="2"><br/><input type="submit" name="Preview" value="Preview" /> <input type="submit" name="Create" value="Create New Page" /></td></tr>
Run Code Online (Sandbox Code Playgroud)
(所有在一条线上)没有用,但是
<tr><td colspan="2"><br />
<input type="submit" name="Preview" value="Preview" />
<input type="submit" name="Create" value="Create New Page" /></td></tr>
Run Code Online (Sandbox Code Playgroud)
工作得很好(多行,也不应该重要).
我喜欢机械化,因为它很容易安装(只是将文件复制到我的include目录中),因为它使用起来非常简单,但除非我遗漏了一些重要内容,否则我觉得像这样的bug很可怕 - 我可以'我想到一个很好的理由,为什么第一个例子应该失败,第二个例子应该工作.
而且,顺便说一句,我还发现了另一个机械化错误,<textarea>
其中包含在a中的a <p>
不被识别为有效控件,但是一旦你从<p>
容器中取出它就会被识别出来.我检查过,textarea 被允许包含在其他块级元素中<p>
.
我建议你使用Twill,它使用机械化(主要是monkeypatched).所以说你有一些带有一些字段的表单和两个名为 "submit_to_preview"和"real_submit"的提交按钮.以下代码应该工作.
顺便说一句,请记住这不是线程安全的,所以如果你想在线程环境中使用代码,你可能想要使用锁.
import twill.commands
b = twill.get_browser()
url = "http://site/myform"
twill.commands.go(url)
twill.commands.fv("2", "name", "Me")
twill.commands.fv("2", "age", "32")
twill.commands.fv("2", "comment", "useful article")
twill.commands.browser.submit("real_submit")
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.干杯.
使用“点击”方法。例如
mybrowser.select_form(nr=0)
req = mybrowser.click(type="submit", nr=1)
mybrowser.open(req)
Run Code Online (Sandbox Code Playgroud)
应该管用。