写入python mechanize模块中的文本输入时出现问题

时间:2011-06-23 05:10:24

标签: python submit mechanize textinput

首先,我正在编写一个python脚本,以自动从dreamhost.com购买某些域名。我首先访问网站的面板,用户可以在该面板上完成网站提供的任何功能。这是代码:

br = mechanize.Browser()
br.open("https://panel.dreamhost.com/index.cgi?tree=domain.registration&")
br.select_form(name="a")
br["username"]="my_username_here"
br["password"]="my_password_here"
br.submit()

这段代码完美无缺,并将我登录到面板中。从这里开始,有一个文本框可以输入您的域名,还有一个多选项可以选择您的扩展名 - 当提交此表单时,它会检查可用性。

我对上述成功采取了类似的方法并执行以下操作:

br.select_form(name="f")
br["Pick Domain Name"] = "domainiwanttobuy"    #textbox
br["tld"] = [extension list]                   #select from dropdown
br.submit()

提交此表单后生成的HTML显示下拉列表已正确更改,但文本字段为空,我从dreamhost收到一条错误消息:“错误:请输入上面的域名。”

所以输入字段不起作用 - 我查看了相应的页面源HTML,这里是:

<input name="fqdn" id="fqdn" class="text reg_domain_input" name="Pick Domain Name" value="mynewdomain" onChange="tradeMarkCheck(this.id)">

首先,它怀疑有2个名字元素。我不能使用name =“fqdn”或它说这样的控件不存在。其次,我看到当值改变时调用javascript函数。我知道机械化无法处理Javascript,但我不相信该函数可以做任何有价值的事情。所以,我认为这不会导致问题。这是相应的javascript函数:

<script type="text/javascript">
function tradeMarkCheck(x) {
    var domain = document.getElementById(x).value;
    var bad = /(dream.*host|host.*dream)/;

    if (bad.test(domain)) {
        alert("NOTE: Domains containing 'DreamHost' in them are not eligible for use with DreamHost Rewards.  Also, please ensure that your site/domain does not dilute or infringe upon the 'DreamHost' trademark (if you have any questions as to whether a use is legal or not, contact us at abuse@dreamhost.com).");
    }
}
</script>

我花了几个小时调试这个并试图找到一个解决方法。任何想法将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:1)

我没有看过该网站,但我强烈怀疑某些javascript正在做一些你没有做机械化的事情。这些情况下的标准答案是使用Selenium Webdriver自动化浏览器(它有一个Python API)。

编辑: Selenium Webdriver有一个HtmlUnit无头浏览器,支持javascript一点,但它远远不是完整的JavaScript支持。 PhantomJS或许可以帮助你,它是Webkit的无头版本。