【Excel VBA×Selenium】Webフォームからファイルをアップロードする方法|input type=file・SendKeys
みなさんこんにちは。
Excel VBA×SeleniumでWebサイトを自動操作していると、WebフォームへPDFやExcel、CSV、画像などのファイルをアップロードしたい場面があるかと思います。
ファイルをアップロードする場合、「ファイルを選択」ボタンをクリックしてWindowsのファイル選択ダイアログを操作する方法を思い浮かべる方も多いかもしれません。
しかし、SeleniumではOS側のファイル選択ダイアログを直接操作するのではなく、<input type=”file”>の要素へアップロードしたいファイルのフルパスをSendKeysで渡す方法が基本となります。
今回は、input type=”file”の確認方法から、VBA×SeleniumでファイルパスをSendKeysする方法、アップロード結果の確認、非表示inputの場合の注意点まで順番にご紹介したいと思います。
この記事はこんな人におすすめ
- Excel VBA×Seleniumでファイルをアップロードしたい人
- 「ファイルを選択」ダイアログを自動操作しようとしている人
- input type=”file”へSendKeysする方法を知りたい人
- WebフォームへPDF・Excel・CSV・画像などを自動添付したい人
- ファイルアップロード処理を業務自動化へ組み込みたい人
といったところでしょうか。
Seleniumではファイル選択ダイアログを直接操作しない
通常、Webサイトで「ファイルを選択」ボタンをクリックすると、Windowsのファイル選択ダイアログが表示されます。
ただし、このダイアログはWebページのHTML要素ではなくOS側の画面になるため、Selenium WebDriverで通常のWebElementとして操作する対象ではありません。
Selenium公式ドキュメントでも、ファイルアップロードではファイル選択ダイアログを開くのではなく、<input type="file">要素へファイルのフルパスをSendKeysする方法が案内されています。
<input type="file" id="file-upload">
DevToolsでinput type=fileを確認する
まずは、アップロード画面にinput type=”file”が存在するか確認します。
Chromeで対象ページを開き、「ファイルを選択」付近を右クリックして検証をクリックします。
DevToolsのElements内で、以下のような要素を探してください。
<input id="file-upload" type="file">

idが設定されていればFindElementById、classや属性から特定したい場合はFindElementByCssやFindElementByXPathを使用できます。
SendKeysでファイルのフルパスを指定する
input type=”file”を取得できたら、アップロードしたいファイルのフルパスをSendKeysします。
Dim filePath As String
filePath = "C:\00_work\upload_test.txt"
driver.FindElementById("file-upload").SendKeys filePath
テキストボックスへ文字列を入力する場合と同じSendKeysですが、input type=”file”の場合はアップロード対象ファイルへのパスとして扱われます。
ファイルの存在を確認してからアップロードする
実務で使用する場合は、SendKeysする前に指定したファイルが存在するか確認しておくと安全です。
Dim filePath As String
filePath = "C:\00_work\upload_test.txt"
If Dir(filePath) = "" Then
MsgBox "アップロードするファイルが見つかりません。" & vbCrLf & _
filePath, vbExclamation
Exit Sub
End If
driver.FindElementById("file-upload").SendKeys filePath
アップロードボタンをクリックする
Webサイトによっては、ファイルを選択しただけではアップロードが完了せず、そのあとに「Upload」や「送信」ボタンをクリックする必要があります。
driver.FindElementById("file-upload").SendKeys filePath
driver.FindElementById("file-submit").Click

アップロード結果を確認する
ファイルアップロード後は、単にクリックできたことだけではなく、正常にアップロードされたか確認しておくと安心です。
Dim uploadedFileName As String
uploadedFileName = driver.FindElementById("uploaded-files").Text
If uploadedFileName = "upload_test.txt" Then
MsgBox "ファイルのアップロードが完了しました。", vbInformation
Else
MsgBox "アップロード結果を確認してください。", vbExclamation
End If

一連のサンプルコード
Sub UploadFile()
Dim driver As New Selenium.WebDriver
Dim filePath As String
Dim uploadedFileName As String
filePath = "C:\00_work\upload_test.txt"
If Dir(filePath) = "" Then
MsgBox "アップロードするファイルが見つかりません。" & vbCrLf & _
filePath, vbExclamation
Exit Sub
End If
driver.Start "Chrome"
driver.Get "https://the-internet.herokuapp.com/upload"
driver.FindElementById("file-upload").SendKeys filePath
driver.FindElementById("file-submit").Click
driver.Wait 1000
uploadedFileName = driver.FindElementById("uploaded-files").Text
If uploadedFileName = "upload_test.txt" Then
MsgBox "ファイルのアップロードが完了しました。", vbInformation
Else
MsgBox "アップロード結果を確認してください。", vbExclamation
End If
End Sub
このサンプルでは、Selenium公式ドキュメントのファイルアップロード例でも使用されているテストページを利用しています。
実際の業務サイトで使用する場合は、URL・id・XPathなどを対象ページに合わせて変更してください。
「ファイルを選択」ボタンをクリックする必要はない
今回の方法では、「ファイルを選択」ボタンをクリックして、Windowsのダイアログからファイルを探す必要はありません。
Webページにあるinput type=”file”へ直接ファイルパスを渡すため、OS側のダイアログ操作を自動化する必要がなくなります。
input type=fileが非表示になっている場合
Webサイトによっては、画面上に表示されているボタンとは別に、input type=”file”がCSSなどで非表示になっていることがあります。
この場合も、まずDevToolsで実際のinput type=”file”がどこにあるのか確認してください。
Seleniumではfile inputに対するinteractabilityの扱いを変更する設定もあり、ドライバーや実行環境、対象サイトの実装によっては非表示要素へのSendKeysがそのまま利用できない場合があります。
- 本当にinput type=”file”を取得できているか
- 表示用ボタンではなく実際のfile inputを取得しているか
- 対象要素がiframe内に存在していないか
- JavaScriptによってinput要素が動的に作成されていないか
- ファイルパスが正しいか
- 対象サイト側でファイル形式やファイルサイズが制限されていないか
SendKeysに関する過去の記事
SendKeysを使用したキーボード入力については、過去の記事でもご紹介しています。
ファイルをダウンロードする場合
今回とは反対に、Webサイト上のファイルをローカルPCへ保存したい場合についても過去の記事でご紹介しています。
よくある原因と確認ポイント
| 状況 | 確認するポイント |
|---|---|
| ファイル選択ダイアログを自動操作しようとしている | input type=”file”へ直接SendKeysする |
| 要素が見つからない | DevToolsでid・class・XPathを確認する |
| SendKeysしてもアップロードされない | フルパス・ファイルの存在・対象inputを確認する |
| 独自デザインのアップロードボタンがある | 背後にあるinput type=”file”を探す |
| 要素がiframe内にある | iframeへ切り替えてから要素を取得する |
| ファイル選択後に処理が進まない | 送信・Uploadボタンが別途必要か確認する |
参考情報
最後に
いかがでしたでしょうか。
今回は、Excel VBA×SeleniumでWebフォームからファイルをアップロードする方法についてご紹介しました。
ファイルアップロードでは、Windowsのファイル選択ダイアログを直接操作するのではなく、input type=”file”を取得してファイルのフルパスをSendKeysするのがポイントです。
DevToolsでHTML構造を確認できれば、PDF・Excel・CSV・画像などを扱うさまざまなWebフォームへ応用できます。
実務のWeb操作自動化で使用する機会も多い内容になりますので、少しでも参考になれば幸いです。
開発依頼について
ココナラでWebスクレイピング開発サービスを出品しております。
自分で開発をしようと思ったけど、VBAでのネット記事が少なく困っている方も多いかと思います。
そんな方はいつでもお気軽にご相談ください。
また、本ブログからご依頼いただいた方については割引特典がございますので、
ご不明点と合わせてメッセージをいただけると幸いです。
Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!Webスクレイピング以外にもWebアプリの開発サービスも出品しております。
こちらについても、本ブログからご依頼いただいた方については割引特典がございますので、
お気軽にご相談ください。
スモールスケールのWebアプリ開発します 先ずはスモールスケールのWebアプリから始めませんか?
