【问题标题】:Python mechanize - Submit form twicePython mechanize - 提交表单两次
【发布时间】:2016-01-19 14:53:49
【问题描述】:

我有这个网站,上面有我想填写的表格。有需要提交的表格,在第一个表格中您必须填写输入标签。当您提交第一个表单时,它会生成另一个表单,其中包含一个显示您刚刚提交的内容的表格,该表单还有一个提交按钮,您必须单击该按钮以确认您的操作。我会假设该网站使用 javascript 删除第一个表单,然后生成下一个表单,因为 url 在该转换中不会改变。

如何提交/确认下一个表单,即提交第一个表单时生成的表单?

用于填写第一个表格的代码。

import mechanize

b = mechanize.Browser()
b.open("http://www.website.com/a2b.php")

b.select_form("snd")
b.find_control("t1").value = '200'  # number 1
b.find_control("t2").value = '250'  # number 2
b.find_control("t3").value = '300'  # number 3

b.submit()

第一种形式

<form method="POST" name="snd" action="a2b.php">
 <input name="t1" value="" type="text">
 <input name="t2" value="" type="text">
 <input name="t3" value="" type="text">
 <button type="submit" value="ok" name="s1"></button>
</form>

第二种形式

<form method="post" action="a2b.php">
 <table> 
    Table showing the entered data, entered in previous form
</table>

 <input name="timestamp" value="1445368847" type="hidden">
 <input name="timestamp_checksum" value="JEN8mj" type="hidden">
 <input name="ckey" value="20040" type="hidden">
 <input name="id" value="39" type="hidden">
 <input name="a" value="533374" type="hidden">
 <input name="c" value="3" type="hidden">
 <button type="submit" value="ok" name="s1" id="btn_ok"></button>
</form>

【问题讨论】:

  • 您能否向我们提供真实的 URL,以便我们可以重现该示例?谢谢。
  • 它是一款名为 travian 的浏览器游戏,您需要登录才能使用。
  • 好的,但是你用 mechanize 打开的 URL 是什么?谢谢。
  • 这是网址,tx3.travian.com/dorf1.php
  • 感谢您提供表单的 URL。我注册了站点/游戏并尝试在浏览器中逐步完成该过程,但没有遇到您提到的第二种形式。第一个表单是登录表单,对吧?第二个表单/屏幕应该是什么?谢谢。

标签: python forms mechanize form-submit


【解决方案1】:

Mechanize 不能很好地与 javascript 配合使用,请尝试改用 Selenium Webdriver。它将充当浏览器,包括 JS 支持。您可以使用Waits 等待第二个表单出现。

这里是一个示例如何填写表格(我改编了this answer中的代码):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://www.website.com/a2b.php")

def find_by_xpath(locator):
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, locator))
    )

    return element

class FirstFormPage(object):
  def fill_form(self):
    find_by_xpath('//input[@name="t1"]').send_keys('200')
    find_by_xpath('//input[@name="t2"]').send_keys('250')
    find_by_xpath('//input[@name="t3"]').send_keys('300')

    return self # makes it so you can call .submit() after calling this function

  def submit(self):
    find_by_xpath('//input[@value = "ok"]').click()

class SecondFormPage(object):
  def fill_form(self):
    find_by_xpath('//input[@name="timestamp"]').send_keys('1445368847')
    find_by_xpath('//input[@name="timestamp_checksum"]').send_keys('JEN8mj')
    find_by_xpath('//input[@name="ckey"]').send_keys('20040')
    find_by_xpath('//input[@name="id"]').send_keys('39')
    find_by_xpath('//input[@name="a"]').send_keys('533374')
    find_by_xpath('//input[@name="c"]').send_keys('3')

    return self # makes it so you can call .submit() after calling this function

  def submit(self):
    find_by_xpath('//input[@value = "ok"]').click()

FirstFormPage().fill_form().submit()
SecondFormPage().fill_form().submit()
driver.quit() # closes the webbrowser

根据您的需要调整它!

【讨论】:

  • 看起来像一个选项,虽然我不能让它很好地工作。在进入 2 个表单之前,我还需要登录该页面。同样在第二个表单中只是一个确认表单,因此不必更改任何值。
  • 还有Selenium IDE,它可以让你记录浏览器的操作,然后复制它,甚至以后用编程方式编辑它,可能更容易理解。
猜你喜欢
  • 2014-04-12
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多