自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/ExcelVBA/JavaScript/Raspberry Piなどで色んなことを自動化

Python×Seleniumでswitch_to.frameが効かずハマったがchromedriver.exeを更新したら直った

朝のルーチンワークを少しでも減らそうとPythonで売上・アクセスデータの集計報告ツールを作って動作させているのですが、ある日正常に動かなくなった話。

売上・アクセスデータ集計報告ツール

  1. タスクスケジューラからPythonファイルを実行
  2. SeleniumでGoogle Analyticsへログイン
  3. Google AnalyticsからCSVデータをダウンロード
  4. pandasで過去のCSVデータと統合
  5. Excelで集計・分析
  6. 対目標・対前年で比較したデータをSlack BotにPOST

こいつが7月に入ってある日突然CSVデータがダウンロードされなくなった。 Google Analyticsにログインすることはできている。でもCSVはダウンロードされない。

いや、まぁ、手でやっても2分もかからない作業ではあるんですが、やっぱり単純作業はやらなくていいならやりたくないですよね。

chromedriver.exeが古かった

結論から言うと原因はchromedriver.exeが2018年3月時点のものだったこと。 そんなに頻繁に更新があるものと思っていなかったため最初はGoogle Analytics側のDOMが変わったのだろうと疑っていた。

しかし実際のところは以下から最新のchromedriver.exeをダウンロードして以前のexeファイルに上書き保存すれば済む話でした・・・。 2018年6月のバージョンを使うことで改善。

ChromeDriver - WebDriver for Chrome http://chromedriver.chromium.org/downloads

見てもしょうがないかもしれませんが、色々試した経緯を残しておきます。

Google AnalyticsのDOMが変わった・・・?

CSVダウロードに必要な箇所は変わっていませんでした。 ちなみにログインからCSVダウンロードまでのプログラムは以下のようなもの

download_directory = 'ダウンロード先ディレクトリ'
user_id = 'ユーザー名'
user_pass = 'パスワード'
  
driver = init_selenium(download_path=download_directory) # デフォルトダウンロードフォルダ変更
driver.implicitly_wait(10) # 要素表示までの最大待機秒数
driver.get('カスタムレポートのURL')
  
driver.find_element_by_css_selector('#identifierId').send_keys(user_id)
driver.find_element_by_css_selector('#identifierNext > content > span').click()
driver.find_element_by_name('password').send_keys(user_pass)
time.sleep(2)
  
driver.find_element_by_css_selector('#passwordNext span').click()
time.sleep(10)
  
# 操作対象をインラインフレームに移す
iframe = driver.find_element_by_css_selector('#galaxyIframe')
driver.switch_to.frame(iframe)
  
driver.find_element_by_css_selector('.ACTION-exportMenu').click()
driver.find_element_by_css_selector('.TARGET-CSV').click()
time.sleep(10)

Google Analyticsの画面はレポート表示領域がインラインフレームで形成されています。

故に操作対象をiframeに移す処理switch_to.frameが必要になるわけです。

途中からブラウザ接続が切断されていた

find_element_by_css_selectorの指定がおかしいのか? でもエラーで止まってるのはフレームに移動する前段階・・・。

driver.switch_to.frame(iframe)がおかしいのか・・・? でも推奨されている記述どおりで、driver.switch_to_frame(iframe)は使っていないし・・・。

まずdriver.find_element_by_css_selector('#galaxyIframe')が正常に動作しているのか・・・?

と思い検証したところAnalyticsにログインした直後からブラウザーとの接続自体が切れており、何の操作も受け付けられていなかったことが判明。

これは明らかにwebdriver自体がおかしいと思い、冒頭の「chromedriver.exe」の更新にたどり着いたということです。

すごい遠回りでしたねー。次からはまず最初にバージョン確認してみることにします!