1

多くのオプションを試してみましたが、これに対する解決策を見つけるのに苦労しています。

私の理想的な目標は、スクリーンショットができるようになることです

  • 特定の CSS 要素を取得する
  • 要素の高さ全体を取得します (ページの高さよりも長い場合でも)
  • 含まれているアセットが完全に読み込まれるまで待ちます
  • 速い

最初の試行 (chromedriver がインストールされた selenium-webdriver を使用)

Gemfile

gem 'selenium-webdriver'

App.rb

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome 
driver.get url
driver.save_screenshot("screenshot.png")

これはある程度機能しますが、スクリーンショットは最大の高さにトリミングされます (これは Chromedriver の非常に古い問題のようですhttps://code.google.com/p/chromedriver/issues/detail?id=294 )

2 回目の試行 (ポルターガイストを使用して、代わりに phantomjs に切り替えます)

Gemfile

gem 'capybara'
gem 'poltergeist'

App.rb

require "capybara/dsl"
require "capybara/poltergeist"
Capybara.run_server = false
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {
    # Raise JavaScript errors to Ruby
    js_errors: true,
    # Additional command line options for PhantomJS
    phantomjs_options: ['--ignore-ssl-errors=yes', '--ssl-protocol=any'],
  })
end
Capybara.current_driver = :poltergeist

class Screenshot
  include Capybara::DSL

  # Captures a screenshot of +url+ saving it to +path+.
  def capture(url, path)
    # Open page
    visit url

    if page.driver.status_code == 200
      page.driver.save_screenshot(path, :full => true)
      puts "screenshot saved"
    else
      # Handle error
      puts "there was a problem #{page.driver.status_code}"
    end
  end
end

screenshot = Screenshot.new
screenshot.capture url, "screenshot.png"

これにはさまざまな問題があり、

3 回目の試行 (Capybara を使用して page.save_screenshot(path, :full => true) を利用しようとする)

Gemfile

gem 'selenium-webdriver'
gem 'capybara'

App.rb

require 'selenium-webdriver'
require "capybara/dsl"

Capybara.register_driver :chrome do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Capybara.current_driver = :chrome

class Screenshot
  include Capybara::DSL

  # Captures a screenshot of +url+ saving it to +path+.
  def capture(url, path)
    # Open page
    visit url

    page.save_screenshot(path, :full => true)
    puts "screenshot saved"

  end
end

screenshot = Screenshot.new
screenshot.capture url, "screenshot.png"

ショートバージョン - これは役に立たない

4度目の挑戦(ワティル使用)

Gemfile

gem 'watir-webdriver'

App.rb

require 'watir-webdriver'
b = Watir::Browser.new
b.goto url
b.screenshot.save 'screenshot.png'

これは機能します (Firefox を起動します) が、Retina スクリーンショットを撮る機能について DevicePixelRatio に関して同じ問題があります。

5 回目の試行 (Chrome の使用に戻る)

App.rb

require 'watir-webdriver'
b = Watir::Browser.new :chrome
b.goto url
b.screenshot.save './tmp/watir.png'

トリミングされたページの問題にまっすぐ戻ります。

理想的には、最新の ChromeDriver v2.12 のモバイル エミュレーション オプションを使用してこれを実現する方法があると思います。

個々のデバイス属性の指定

個々の属性を指定してモバイル エミュレーションを有効にすることもできます。この方法でモバイル エミュレーションを有効にするには、「mobileEmulation」ディクショナリに「deviceMetrics」ディクショナリと「userAgent」文字列を含めることができます。次のデバイス メトリックを「deviceMetrics」ディクショナリで指定する必要があります。 「width」 - デバイスの画面のピクセル単位の幅 「height」 - デバイスの画面のピクセル単位の高さ 「pixelRatio」 - デバイスのピクセル比

https://sites.google.com/a/chromium.org/chromedriver/mobile-emulation

しかし、それを機能させることはできませんでした。

どんな提案でも本当に感謝します!

4

1 に答える 1

1

この質問は他の誰も答えていないので、できるだけ理想に近づけるために使用したソリューションの概要を説明したいと思いました.

最終的にこれらのファントム JS の問題が解決されるまで

フルハイトのスクリーンショットを保証できる唯一のドライバーは Firefox ドライバーのようです。

私の目的ではデバイス ピクセルを使用した網膜はサポートされていませんが、CSS を使用してスケールを 200% に変換でき、大部分の要素 (ビットマップ画像を除く) は正確です。

Ruby の Retina 解像度で特定のツイートを画面キャプチャする実際の例については、https ://github.com/chrism/twitter-screenshot を参照してください。

于 2014-11-24T10:59:59.437 に答える