今回は、Seleniumでファイルをアップロードする方法について解説します。
Selenium実行前の注意点
Seleniumで自動操作する際の注意点は以下の通りです。
自動操作していいページか確認する
ページによっては、自動操作を禁止している場合もあります。
自動操作を許可しているかどうかの確認方法はこちらの記事をご確認ください。
短時間に操作しすぎない
ファイルをアップロードする場面は、ログイン後のページであることが多いかと思います。
Seleniumで操作する場合はログイン処理から行うことになりますが、短時間に大量にログイン処理を行うとスパムとみなされCAPTCHA認証が出る場合があります。Seleniumで突破できなくはないですが、突破用の処理が必要になってしまうのでなるべく間隔をあけて実行するようにしましょう。
ファイルアップロード手順
今回操作する画面
以下のような、ファイルを選択して送信する機能を自動操作したいと思います。
※ 以下はアップロードだけ可能なダミーのフォームです
ファイルアップロードはsend_keysで行う
Seleniumでのファイルアップロードは、send_keysメソッドを使用します。手動でアップロードする際はボタンを押すためclickメソッドを使いたくなるところですが、以下のように行います。
from selenium import webdriver
#import chromedriver_binary # chromedriver-binaryの場合これも必要
import time
from selenium.webdriver.common.by import By
import os
# アップロードするファイルのパス
downloaddir = os.getcwd() + '\\testpic.jpg'
# ブラウザの起動
driver = webdriver.Chrome()
driver.get('https://~') # 対象のWEBサイトを指定
# ページが開くまで3秒待機
time.sleep(3)
# 「ファイルを選択」ボタンの要素を取得
element = driver.find_element(By.NAME, 'fileupload')
# ファイルパスを引数にしてアップロード
element.send_keys(downloaddir)
# 「送信する」ボタンをクリック
btn = driver.find_element(By.ID, 'uploadbtn')
btn.click()
time.sleep(3)
# ブラウザを閉じる
driver.close()
パスの指定方法
パスの指定方法は2通りあります。
パターン1:フルパスで指定
アップロードファイルをフルパスで指定する方法です。
フルパスを取得してそのままコピペすると失敗します。Pythonでは、パスの指定時に「\」を2つ重ねて記述します。
パターン2:カレントディレクトリを指定
アップロードファイルをカレントディレクトリに配置する際は以下のように指定します。
getcwdメソッドは、プログラムを実行しているディレクトリ(current working directory)を取得します。カレントディレクトリの下にアップロードファイル用のフォルダを作成する場合は、
downloaddir = os.getcwd() + ‘\\xxxxx.png’ # 拡張子まで指定する
上記のように指定します。このとき、拡張子まで指定するようにしてください。
なお、エディタでは\マークはバックスラッシュで表示されます。
スラッシュ( / )と間違えないように注意してください。
トラブルシューティング
ファイルのアップロードにうまくいかない場合の対処法をまとめます。
WebDriverExceptionが発生する
selenium.common.exceptions.WebDriverException: Message: unknown error: path is not absolute: ./testpic.jpg
こちらはパスの指定方法が間違っている場合に発生します。上記の場合、「./testpic.jpg」となっていますが、正しくは「.\\testpic.jpg」です。
エラーは出ないがファイルがアップロードされず終了する
element.send_keysで指定しているパスにファイルが存在していない場合、このような現象が起こります。
ElementNotInteractableExceptionが発生する
selenium.common.exceptions.ElementNotInteractableException
要素はあるけど、その要素を操作できる状態にない、というエラーです。
ヘッドレスモード(画面を表示せず実行)している場合に起こることがあります。また、画面に表示しきれていない要素を操作しようとしたり、まだ画面が読み込まれないうちに要素を操作しようとする場合にも発生します。
Invalid first_paintが発生する
Invalid first_paint
こちらは思い当たることがなく、調べてみたところドライバーとブラウザのバージョンが異なることにより発生するエラーのようです(参考)。バージョン違いのエラーってSessionNotCreatedExceptionが出るパターンしか見たことがなかったので半信半疑でドライバーのバージョンを更新したらエラーが消えました。。。
ドライバーのバージョン更新は以下記事で詳しく解説しています。
まとめ
今回は、Seleniumでファイルをアップロードする方法について解説しました。
ボタンクリックではなく、send_keysメソッドでパスを指定してアップロードするということが分かりました。
Seleniumでファイルをダウンロードする方法についても過去記事にて解説しています。
コメント