Selenium で Chrome の Web Driver を用いてスクリーンショットをとると、画面に表示されている部分のみのスクショが撮影されます。画面全体のスクショをとるには、頑張って画面をスクロールして何回かに分けて画像を撮り、それを結合する必要があります。
require 'selenium-webdriver'
require 'rmagick'
module WebdriverUtil
def get_screenshot (driver)
# 表示領域の大きさ
innerH = driver.execute_script("return document.compatMode == 'BackCompat' ? document.body.clientHeight : document.documentElement.clientHeight").to_i
innerW = driver.execute_script("return document.compatMode == 'BackCompat' ? document.body.clientWidth : document.documentElement.clientWidth").to_i
# コンテンツ全体の長さ
scrollH = driver.execute_script("return document.documentElement.scrollHeight").to_i
scrollW = driver.execute_script("return document.documentElement.scrollWidth").to_i
# 表示領域の大きさがコンテンツ全体の長さより大きい場合
if innerH > scrollH then
innerH = scrollH
end
if innerW > scrollW then
innerW = scrollW
end
# ImageMagick を使う
image = Magick::Image.new(scrollW,scrollH){self.background_color = "red"}
x = 0
while x < scrollW
if x + innerW > scrollW then
x = scrollW - innerW
end
y = 0
while y < scrollH
if y + innerH > scrollH then
y = scrollH - innerH
end
# スクロール位置を移動
driver.execute_script("window.scrollTo(" + x.to_s + "," + y.to_s + ")")
# PNG 形式でスクリーンショットを取得する
binary = driver.screenshot_as(:png)
# RMagick 形式にする
oneImage = Magick::Image.from_blob(binary).first
# 画像を結合
image.composite!(oneImage, x, y, Magick::OverCompositeOp)
y += innerH
end
x += innerW
end
return image
end
def save_screenshot (driver, filename)
image = get_screenshot(driver)
# ファイルに書き込む
image.write(filename)
end
module_function :save_screenshot
module_function :get_screenshot
end
Ruby 始めて1月も経ってないので細かい部分は許してください。RMagick を使っているので、gem 等でインストールする必要があります。