在 python mechanize 模块中写入文本输入的问题

Posted

技术标签:

【中文标题】在 python mechanize 模块中写入文本输入的问题【英文标题】:Problem writing to a text input in python's mechanize module 【发布时间】:2011-09-20 22:22:58 【问题描述】:

首先,我正在编写一个 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 函数。我知道 mechanize 无法处理 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】:

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

编辑: Selenium Webdriver 有 HtmlUnit 无头浏览器,它稍微支持 javascript,但远未完全支持 javascript。 PhantomJS 或许能帮到你,它是 Webkit 的无头版本。

【讨论】:

唯一的问题是我无法让用户看到该进程,据我所知,没有办法使用 selenium 对用户隐藏浏览器吗? 我最终选择了 Selenium——Python 的文档很糟糕,但是一旦你弄清楚了语法,一切都会正常运行。感谢您的帮助。

以上是关于在 python mechanize 模块中写入文本输入的问题的主要内容,如果未能解决你的问题,请参考以下文章

Python Mechanize.Browser.Open(url) 状态码

性能测试框架Multi-Mechanize安装与使用

在 python 中使用 mechanize 剥离 html 标签并仅返回文本

如何使用python和mechanize登录网站

Perl 与 Parallel::ForkManager 和 WWW::Mechanize 一起崩溃

Python 中哪个最好:urllib2、PycURL 或 mechanize?