先日、ヘッドレス ChromeでWebページ全体のスクリーンショットを撮る方法について書かれた下記の記事を見つけました。
>>> page_width = driver.execute_script(‘return document.body.scrollWidth’)
>>> page_height = driver.execute_script(‘return document.body.scrollHeight’)
>>> driver.set_window_size(page_width, page_height)
なるほど。ウィンドウの大きさをページに合わせるわけですね!
これは簡単で便利そう。
ヘッドレス Chromeについては一年ほど前に記事を書いていたので、さっそく同じようにSeleniumBasicでWebページ全体のスクリーンショットを撮るコードを書いてみました。
下記コードの注意点として、この記事でも書いている通り、SeleniumBasicに同梱されているChromeDriverのバージョンは古いものなので、操作対象となるChromeのバージョンに合ったファイル(chromedriver.exe)に、事前に差し替える必要があります。
Public Sub Sample() Dim w As Long, h As Long With CreateObject("Selenium.ChromeDriver") .Timeouts.ImplicitWait = 3000 .AddArgument "--headless --disable-gpu --hide-scrollbars" .Start .Get "https://news.yahoo.co.jp/" w = .ExecuteScript("return document.body.scrollWidth") h = .ExecuteScript("return document.body.scrollHeight") .Window.SetSize w, h 'ウィンドウサイズ変更 .TakeScreenshot.SaveAs "C:\Test\SC.jpg" .Quit End With MsgBox "処理が終了しました。", vbInformation + vbSystemModal End Sub
画像サイズが大きいので分かりづらいですが、ちゃんと意図した通りに画面全体のキャプチャーが撮れているようです。
ついでに、上記コードを改変して、URLを渡したらスクリーンショットをピクチャフォルダに保存するVBScriptのコードも書いてみました。
(後から気が付きましたが、InputBoxでURLを受け取るようにした方が便利だったかもしれません。)
Option Explicit Dim args Dim w, h Dim fp, fn Dim v Const CSIDL_MYPICTURES = 39 Set args = WScript.Arguments If args.Count < 1 Then WScript.Quit '保存先ファイルパス設定 v = Split(Split(args(0), "://")(1), "/") fn = v(0) & ".jpg" With CreateObject("Scripting.FileSystemObject") fp = .BuildPath( _ CreateObject("Shell.Application").Namespace(CSIDL_MYPICTURES).Self.Path, _ fn) End With With CreateObject("Selenium.ChromeDriver") .Timeouts.ImplicitWait = 3000 .AddArgument "--headless --disable-gpu --hide-scrollbars" .Start .Get args(0) w = .ExecuteScript("return document.body.scrollWidth") h = .ExecuteScript("return document.body.scrollHeight") .Window.SetSize w, h .TakeScreenshot.SaveAs fp .Quit End With WScript.Echo "処理が終了しました。"
縦長のページもちゃんと撮れているようです。
ページ全体のスクリーンショットを撮る機会は割と多いので、ヘッドレス Chromeを使う方法を覚えておくと色々と活用できそうですね!
この記事へのコメントはありません。