【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">
Chrome DevToolsでファイルアップロード用のinput 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
Excel VBA×Seleniumでupload_test.txtのファイルアップロードが完了した画面

一連のサンプルコード

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アプリから始めませんか?

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA