SeleniumでWEBページ全体のキャプチャを取得する Python VBA

##Seleniumで WEBページ全体のキャプチャを取得する Python VBA



##ポイント　
①クロームを使う
②ヘッドレスにする
③1ページごとに縦と横の長さをjavascriptで取得し、セットし、キャプチャを取得する
④急にタイムアウトするような思いサイトはクロームを再起動すればOK

キャプチャ取得の依頼はいきなり来るので迅速かつ、キャプチャ漏れがないように気を付ける必要があります。
そのために、所定のフォルダにキャプチャができているか最後に確認します。
タイムアウトした場合はクロームを再起動したら、続けてキャプチャ取得できます。
迅速にプログラムを書くために一番簡単な方法にしてます。でもこれでなんとかなりますよ。

■環境
・Windodws10
・Python　3.8.3

##python　selenium でWEBページ全体のキャプチャを取得する
```python:WEBページ全体のキャプチャを取得する
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


options = Options()
options.add_argument('--hide-scrollbars')　#スクロールバーを消す
options.add_argument('--incognito')        #シークレットモード
options.add_argument('--headless')         #ヘッドレス（ブラウザが見えなくなります。テスト終了後にこのオプションを追加するのがよい）
driver = webdriver.Chrome(options=options) #パスが通っているときの記述

try:
  WebDriverWait(self.driver, 15).until(EC.presence_of_all_elements_located)
  driver.get("https://testtesttest.com")  
　#↑キャプチャ対象のURLに移動する　画像や宣伝の多いサイトは突如タイムアウトエラーが頻発することがあるので　
except Exception:
   #ここにドライバーの再起動の記述を書く
   

#縦と横のサイズを取得してキャプチャを取得する   
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)

#ファイル名用に現在時刻の取得
now = datetime.datetime.now()
zikan = now.strftime('%Y%m%d_%H%M%S')
filename = "ファイル名"+ "_"+ zikan + ".jpg"   #拡張子はpingでもOK

#キャプチャの取得
driver.save_screenshot("./フォルダ名/" + filename)

#キャプチャファイルができているか最大5秒探す
start=time.time()
while time.time()-start<=5:
  if os.path.exists(./フォルダ名/+filename):
      break 　　　　　#ファイルが見つかったら抜ける       
      time.sleep(1)
else:
  #キャプチャがみつからなかったときの処理を書く

driver.quit()
```




##vba seleniumBasicでWebページ全体のキャプチャを取得する
vbaで運用の場合、
多数のエクセルファイルが起動していることが多いのでキャプチャ保存先は
相対パスではなくフルパスで記述してます。
経験上、画像や宣伝の多いサイトは突如タイムアウトエラーが頻発します。
その場合も自作関数OnceMoreGetで再起動処理を入れたら、止まらずに進みました。

```vb:WEBページ全体のキャプチャを取得する
Dim deiver as New ChromeDriver
Dim tate As Long
Dim yoko As Long
Dim Target as String
driver.AddArgument "headless" 'ヘッドレス
driver.AddArgument "disable-gpu" '暫定的に必要なオプション。不必要かもしれませんが念のため
driver.AddArgument "incognito"   'シークレットモード
driver.AddArgument "hide-scrollbars"　　'スクロールバーを消す

'読込やタイムアウトの待ち時間を設定する　30秒
driver.Timeouts.PageLoad = 30000        
driver.Timeouts.Server = 30000
driver.Timeouts.ImplicitWait = 30000
driver.Timeouts.Script = 30000
driver.Start

'タイムアウトしない軽いサイトならシンプルに
'driver.get("サイトのURL")　でOK
'↓は画面遷移後タイムアウトしたら再起動する関数
If Not OnceMoreGet(driver, "サイトのURL") Then     
     'タイムアウト後再起動も失敗した場合はここに何らかの処理を書く    
End If

'キャプチャ取得処理
tate = driver.ExecuteScript("return document.body.scrollHeight")
yoko = driver.ExecuteScript("return document.body.scrollWidth")
driver.Window.SetSize yoko, tate
Target = "ここにはフルパスでファイル名を入れる"

'スクリーンショット　ここでエラーの時もあるのでエラー回避の処理あったほうがいいです。
driver.TakeScreenshot.SaveAs (Target)      

'キャプチャができているか　Dir関数で確認しましす。
Dim timeout As Date
timeout = DateAdd("s", 5, Now)
Dim str As String
Do
  str = Dir(Target)
  If Now > timeout Then
     'キャプチャファイルのみつからなかったときの処理を書く
  End If   
    
Loop Until str <> ""

driver.quit

'タイムアウトエラーが発生した場合に再起動する関数
Function OnceMoreGet(driver As ChromeDriver, url As String) As Boolean
　　On Error GoTo ErrorHandler
    diver.Get (url)        
    OnceMoreGet = True
    Exit Function        
ErrorHandler:
    '例外発生した場合再起動
    driver.Quit
    Call WaitFor(3)
    driver.Start
    driver.Get (url)
    OnceMoreGet = True
End Function

```

一人で素人が書いてます。
アドバイスとかコメントいただけたら嬉しいです。