我也想在Heroku上使用Selenium!


在许多情况下,您想使用Selenium进行浏览器测试,例如,作为网站爬网或正在开发的Web应用程序的UAT。那么,如何在Heroku上执行这些操作呢?

Heroku CI提供称为Heroku CI的ベータ機能:浏览器和用户接受测试(UAT)。在这里,可以使用无头Chrome,通过利用此功能,可以实现UAT和抓取。

如何在Heroku上使用Headless Chrome

没有

https://github.com/heroku/heroku-buildpack-google-chrome这样的东西,只是放在buildpack中。由于您将需要单独的语言运行时来运行Headless Chrome,因此您将具有一个multi buildpack配置,该配置指定多个buildpack。它的名字很漂亮,但是只是放入了多个buildpack。

您可以从Heroku仪表板或Heroku CLI轻松安装buildpack。

从Heroku仪表板

在要使用的Heroku应用程序的仪表板上,转到Settings选项卡。在Buildpacks项中有一个名为"添加Buildpack"的按钮,因此只需单击它,然后输入要使用的buildpack的URL或编程语言名称,然后再按Save changes

Screen Shot 2019-05-28 at 16.57.48.png

对于Heroku CLI

使用

heroku buildpacks:add命令。 heroku buildpacks:set命令通常用于指定编程语言。要获得多buildpacks配置,您需要添加buildpacks:add。有关更多信息,请参见为应用程序使用多个Buildpacks。

1
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome -a <APP_NAME>

<APP_NAME>

指定目标Heroku应用名称

我也想用硒!

如果使用Selenium,则将需要一个额外的heroku-buildpack-chromedriver buildpack。添加方法与Chrome驱动程序相同,并且添加了buildpack。

要添加的Chrome驱动程序的URL为https://github.com/heroku/heroku-buildpack-chromedriver

如何在Heroku上使用Selenium

现在,如果我设置了buildpack并实际使用它们,该怎么办?注意以下两点是没有问题的。

  • 使用Headless Chrome的--headless--disable-gpu选项
  • chrome二进制PATH指定环境变量$GOOGLE_CHROME_SHIM
  • 配置样本

    例如,对于Ruby,指定如下。

    1
    2
    3
    4
    5
    options = Selenium::WebDriver::Chrome::Options.new
    options.binary = ENV.fetch("GOOGLE_CHROME_SHIM")
    options.add_argument('headless')
    options.add_argument('disable-gpu')
    driver = Selenium::WebDriver.for :chrome, options: options

    之后,照常挤压硒就没有问题。

    在Heroku CI上使用时为

    要将其用作

    Heroku CI上的UAT,需要定义它以在app.json上使用buildpack。

    例如,要在test环境中定义,请在environments中定义Buildpacks,如下所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {
      "environments": {
        "test": {
          "buildpacks": [
            { "url": "heroku/ruby" },
            { "url": "https://github.com/heroku/heroku-buildpack-google-chrome" },
            { "url": "https://github.com/heroku/heroku-buildpack-chromedriver" }
          ]
        }
      }
    }

    预防措施

    • 尚未正式提供这两个buildpack,目前不支持。

    奖金-在Heroku上使用Selenium下载时

    当您说要下载

    文件时,请记住以下几点:

  • setDownloadBehavior设置为allow

  • 设置preference以自动下载到指定目录
  • 在Ruby中设置

    要制作

    setDownloadBehavior allow,请定义以下方法,指定Selenium driver和下载目标directory,然后允许下载到指定的下载目标。
    将来,由于Google Chrome内部结构的变化,预计这种书写方式将会改变或变得不必要。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def enable_chrome_headless_downloads(driver, directory)
      bridge = driver.send(:bridge)
      path = '/session/:session_id/chromium/send_command'
      path[':session_id'] = bridge.session_id
      bridge.http.call(:post, path, {
      "cmd" => "Page.setDownloadBehavior",
      "params" => {
        "behavior" => "allow",
        "downloadPath" => directory,
      }
    })
    end

    例如,在名为prefs的对象中,指定要下载的目录和自动下载的选项,并指定options.add_preference应该用于其他设置。

    1
    2
    3
    4
    5
    6
    prefs = {
      prompt_for_download: false,
      directory_upgrade: true,
      default_directory: download_directory
    }
    options.add_preference(:download, prefs)

    用作Worker Dyno时的注意事项(于2019年5月31日添加)

    我收到了开发人员的说明,该说明实际上是在以Worker Dyno身份启动的情况下运行的,因此我将其添加。如果您知道如何处理,我将再次添加。

  • 当在Dyno重新启动过程中发送SIGTERM时,Chrome进程似乎首先停止。然后,它将从Selenium一侧执行而失去控制
  • 在单次测功的情况下,假定此事件没有发生,因为它只是强制停止,除非运行24小时或更长时间。