自动化Chrome

19
我曾经在Firefox和Chrome中将url编码的Javascript复制到URL中时看到了一些奇怪的事情发生。是否可以使用这种技术让Chrome访问一个URL并将其保存为文件?我正在尝试自动化Chrome,但Selenium看起来非常令人畏惧。
编辑:不幸的是,在这里我忘记更清楚地说明。我解释一下。像wget、curl等工具都行不通,因为我必须通过某些脚本进行登录。我已经看过iMacros,但发现除了在Windows上支付499美元的包之外,我无法让它们从命令行运行。GCE的一些其他优点是,开发平台是免费的,并且在某种程度上是开放的,它们也是跨平台的(我使用Linux)。
编辑:此时,我正在学习Google Chrome扩展程序。它们似乎很容易构建,并且可以让我(我想)告诉浏览器打开一个新标签页,转到一个页面,在该页面上操作DOM(例如填充一些字段并登录),然后在响应页面上操作DOM。GCE不能执行文件I/O,因此它们不像Firefox扩展程序那样具有XPCOM,但是您可以使用AJAX将数据发送到后端脚本(例如LAMP服务器上的PHP脚本)以保存该数据。
编辑:顺便说一句,这是略微偏题(但我添加以澄清)我提到的那些Javascript中的“奇怪事情”是您操作DOM创建一个看起来像这样的URL:
javascript:(function(){...your URL-encoded Javascript here...})();

你正在使用nix机器吗?如果是的话,wget是你的好帮手! - Kyle Wild
5个回答

14

解决方案似乎是制作自己的谷歌浏览器扩展程序(GCE)。如果您知道如何做一些稍微高级的Javascript操作,那么在大约4小时内就可以学会,而且功能非常强大。我可以使用标签API创建一个新标签并转到特定URL。然后我可以注入jQuery到该URL中,并使其操作DOM或执行任何我们通常使用jQuery可以完成的任务。我不能进行文件I / O,但有两个解决方法。其一,我可以强制浏览器从远程位置下载文件,其二,我可以通过jQuery的$.get()或$.post()调用将当前页面的数据发送回到远程服务器。


我使用setInterval函数定期运行一些JavaScript代码,该代码操作DOM。我通过打开Chrome Dev Tools并在JavaScript控制台中注入脚本来实现此目的。问题是,如果页面重新加载,则需要手动重新注入脚本。有没有办法自动化这个过程,使脚本持续执行,即使页面重新加载也能生效? - Web User
有没有带示例的教程? - jechaviz

12
你可以使用Python通过 pywebkitgtk 自动化Web任务。它是针对WebKitGtk的Python绑定,使用的是与Chrome相同的WebKit引擎。
感谢这篇博客文章 pywebkitgtk - Execute JavaScript from Python,我制作了一个webkit.WebView子类,使这些任务更加容易。
import gtk
import webkit
import json

class WebView(webkit.WebView):
    def eval_script(self, script):
        self.execute_script('oldtitle=document.title;document.title="!!!!";document.title=JSON.stringify(eval(' + json.dumps(script) + '));')
        result = json.loads(self.get_main_frame().get_title())
        self.execute_script('document.title=oldtitle;')
        return result
    def wait_for_load(self):
        handle = None
        def load_status_cb(view, frame):
            if frame == view.get_main_frame():
                self.disconnect(handle)
                gtk.main_quit()
        handle = self.connect('load-finished', load_status_cb)
        gtk.main()

我添加了名为eval_script的函数,类似于execute_script,但你可以将函数结果作为Python对象获取。你只需要确保你要评估的内容是JSON可序列化的。

此外,我添加了一个相当自解释的wait_for_load函数。

要设置UI,首先必须创建窗口、滚动窗口和Web视图。

# window
window = gtk.Window()
window.set_default_size(800, 600)

# scroll view
scroll_view = gtk.ScrolledWindow()
scroll_view.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC
scroll_view.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC

# web view
web_view = WebView()

# events
window.connect('delete-event', lambda window, event: gtk.main_quit())

# show
scroll_view.add(web_view)
window.add(scroll_view)
window.show_all()

然后你就可以开始自动化了!例如,这段代码加载了Stack Overflow的登录页面,点击Facebook登录按钮,填写用户名和密码(在本例中为“test”)。最后,它显示登录按钮文本。

# the script is here
web_view.open('http://www.stackoverflow.com/users/login')
web_view.wait_for_load()

web_view.execute_script('openid.signin("facebook")')
web_view.wait_for_load()

web_view.execute_script('document.querySelector("#email").value = "test"')
web_view.execute_script('document.querySelector("#pass").value = "test"')

print "Login's button text is:", web_view.eval_script('document.querySelector("#buttons input[type=\\"submit\\"]").value')

在我的情况下,Facebook的界面是泰语,我可以看到登录按钮的文本。

登录按钮的文本是:เข้าสู่ระบบ

你也可以通过调用该元素上的click()使其实际点击提交按钮。 (注意:click()仅适用于按钮元素,而不适用于链接)

web_view.execute_script('document.querySelector("#buttons input[type=\\"submit\\"]").click()')
web_view.wait_for_load()

您会注意到,在所有脚本都完成后,该应用程序会在不等待的情况下自动关闭。

如果您希望在完成其中所有脚本后继续运行该应用程序,您需要添加以下最后一行代码:

gtk.main()

如果您删除 window.show_all() 行和最后一行的 gtk.main(),那么您的应用程序将在没有 GUI 的情况下运行。(注意:您仍需要显示服务器。)

现在我们还没有好的 pywebkitgtk 文档,所以您必须查看 WebKitGtk 的文档。祝好运。


0
你可以查看http://qaagent.com。这是一种简单的自动化一些与网页相关的任务的方法。

0

您可以尝试iMacros for Chrome。这是一个相当易于使用的自动化系统。

  1. 打开 iMacros
  2. 点击 录制
  3. 开始您的浏览程序。
  4. 点击停止。

我认为再没有比这更简单的了。它保存的脚本是纯文本,因此如果需要,您可以编辑它们以进行一些精细的控制。


1
看看我的新评论。我很抱歉我没有更清楚地表达。首先,除非您购买价值499美元的版本,否则iMacros不会让您完全自动化,而且这只在Windows上完全自动化。通过完全自动化,我指的是制作计划任务脚本。我尝试在Linux上使用免费版本的iMacros进行cron作业,或者甚至手动针对Firefox运行命令行。结果怎样?iMacro在Linux上无法自动运行。相反,Firefox只是打开并停止了。而Chrome的环境过于beta——无法让您保存文件。 - Volomike
iMacros是垃圾。我已经尝试过两次,用于两个不同的目的,但都没有成功。它看起来很流畅,我正在记录我的命令并感到兴奋。在这两种情况下,我只是做了一些非常简单的事情:打开一个网页,在线填写表格,点击提交按钮。他们甚至有一个可以完成此操作的示例脚本。但在我的两个案例中,它在播放期间仅抛出错误,并且根本无法工作。垃圾。 - HerrimanCoder

0

一定要试试Watir!我觉得它非常简单易懂。它可以轻松地与Selenium、Chrome、IE或Firefox一起使用。虽然Chrome版本尚未得到官方支持,但他们声称它是可用的。我自己只用过它来测试Selenium、IE和Firefox。

此外,如果你正在寻找前沿的BDD(行为驱动开发),Cucumber很容易与Watir集成。它只是Ruby代码,是开源的,并托管在gitHub上。享受吧!


1
如果你是Ruby的粉丝,那当然可以选择它。但我不是Ruby的粉丝。 - Volomike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接