【问题标题】:Automating Chrome自动化 Chrome
【发布时间】:2011-06-11 11:33:48
【问题描述】:

当我将一些 urlencoded Javascript 粘贴到 Firefox 和 Chrome 上的 URL 中时,我看到了一些疯狂的事情发生。是否可以使用这种技术告诉 Chrome 访问 URL,然后将其保存为文件?我正在尝试自动化 Chrome,而 Selenium 看起来非常令人生畏。

编辑:不幸的是,我忘了在这里说得更清楚。让我解释。 wget、curl 等东西不起作用,因为我必须在其中一些脚本中登录。而且我查看了 iMacros,但发现除了在 Windows 上之外,我无法让它们从命令行运行,除非我支付 499 美元的软件包。 GCE 的其他一些优点是开发平台在某种程度上是免费和开放的,并且它们是跨平台的。 (我使用 Linux。)

编辑:此时,我正在学习 Google Chrome 扩展程序。看起来它们很容易构建,并且会让我(我认为)告诉浏览器打开一个新选项卡,转到一个页面,操作该页面上的 DOM(例如填充一些字段和登录),然后操作响应页面上的 DOM。 GCE 不允许您执行文件 I/O,因此它们不像带有 XPCOM 的 Firefox 扩展,但您可以通过使用 AJAX 将数据发送到后端脚本(如 LAMP 服务器上的 PHP 脚本)来保存那个数据。

编辑:顺便说一句,这有点偏离主题(但我补充说明)我提到的那些在 Javascript 中的“疯狂的东西”是当你操作 DOM 创建一个 URL 时看起来像这样:

javascript:(function(){...your URL-encoded Javascript here...})();

【问题讨论】:

  • 你在nix机器上吗?如果是这样,wget 就是你的朋友!

标签: javascript google-chrome automation


【解决方案1】:

解决方案似乎是制作自己的Google Chrome Extension (GCE)。如果你知道如何做稍微高级的 Javascript 东西,大约 4 小时内就很容易学会,而且非常强大。我可以使用 Tabs API 创建一个新选项卡并转到特定 URL。然后,我可以将 jQuery 注入该 URL 并使其操纵 DOM 或执行我们通常可以使用 jQuery 执行的任何操作。我不能进行文件 I/O,但有两种解决方法。一,我可以强制浏览器从远程位置下载文件,我可以通过 jQuery 的 $.get() 或 $.post() 调用将当前页面的数据发送回远程服务器。

【讨论】:

  • 我使用 setInterval 函数定期运行一些 JavaScript,该函数操纵 DOM。我通过打开 Chrome 开发工具并在 JavaScript 控制台中注入脚本来做到这一点。问题是如果页面重新加载,那么我需要再次手动重新注入脚本。有什么方法可以自动执行此操作,以便脚本不断执行,在任何页面重新加载后幸存下来?
  • 有没有例子的教程?
【解决方案2】:

您可以使用 Python 通过pywebkitgtk 自动执行 Web 任务。它是WebKitGtk的Python绑定,使用WebKit引擎,和chrome一样的引擎。

感谢这篇博文,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()

然后你就可以开始自动化了!例如,这段代码加载了 StackOverflow 的登录页面,点击 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's documentation。祝你好运。

【讨论】:

    【解决方案3】:

    你可以试试iMacros for Chrome。这是一个非常易于使用的自动化系统。

    1. 打开 iMacros
    2. 点击录制
    3. 开始你的日常浏览。
    4. 点击停止。

    我认为没有比这更容易的了。它保存的脚本是纯文本格式,因此您可以根据需要对其进行编辑以进行精细控制。

    【讨论】:

    • 查看我的新评论。我很抱歉我没有更清楚。一方面,除非您购买 499 美元的版本,否则 iMacros 不会让您完全自动化,并且只能在 Windows 上完全自动化。通过完全自动化,我的意思是制作计划任务脚本。我试图让 iMacros 的免费版本在 Linux 上使用 cron 作业,甚至是针对 Firefox 的命令行运行(手动)。发生什么了? iMacro 不会在 Linux 上自动运行。相反,Firefox 只是打开并停止。而且 Chrome 的环境太测试了 - 不会让你保存文件。
    • iMacros 是垃圾。我已经为 2 个不同的目的尝试了两次,但都没有成功。看起来很流畅,我正在记录我的命令并变得兴奋。在这两种情况下,我都在做一些非常简单的事情:在线访问网页,填写表格,单击提交按钮。他们甚至有一个执行此操作的示例脚本。但在我的两种情况下,它只是在播放过程中抛出了一个错误,根本不起作用。垃圾。
    【解决方案4】:

    一定要查看Watir!我觉得它非常简单。它与 Selenium 一起工作就像与 Chrome、IE 或 Firefox 一样容易。尽管 Chrome 的版本尚未得到官方支持,但他们声称它是可用的。我自己只将它用于 Selenium、IE 和 Firefox。

    此外,如果您正在寻找尖端的 BDD(行为驱动开发),Watir 可以轻松与 Cucumber 集成。它只是 Ruby 代码,是开源的,托管在 gitHub 上。享受吧!

    【讨论】:

    • 如果一个人是 Ruby 的粉丝,当然,去吧。我不是 Ruby 的粉丝。
    【解决方案5】:

    您可以结帐http://qaagent.com。这是自动化一些与网络相关的任务的简单方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 2011-01-20
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多