多くのオプションを試してみましたが、これに対する解決策を見つけるのに苦労しています。
私の理想的な目標は、スクリーンショットができるようになることです
- 特定の 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"
これにはさまざまな問題があり、
- ページの全長をキャプチャします
- Web フォントは埋め込まれていません ( https://github.com/ariya/phantomjs/issues/12132 )
- retina は利用できません ( https://github.com/ariya/phantomjs/issues/10964 )
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
しかし、それを機能させることはできませんでした。
どんな提案でも本当に感謝します!