seleniumでファイルを開くのは難しい
pywinauto を使用して処理を行う
pip install pywinauto pywin32
import pywinauto
def fileopen(filepath: str) -> None :
# pywinautoによる制御
findWindow = lambda: pywinauto.findwindows.find_windows(title='開く')[0]
dialog = pywinauto.timings.wait_until_passes(5, 1, findWindow)
pwa_app = pywinauto.Application()
pwa_app.connect(handle=dialog)
window = pwa_app['開く']
window.wait('ready')
#ファイル入力(Alt+N)
pywinauto.keyboard.send_keys("%N")
edit = window.Edit4
edit.set_focus()
edit.set_text(filepath)
# ダイアログの「開く」ボタンをクリック
button = window['開く(&O):']
button.click()
クリックが反応してくれない場合がある。(フォームが最前面ではないから)ということより、最終的には下記になった
import pywinauto
from pywinauto import win32defines
def fileopen(self, filepath: str) -> None :
# pywinautoによる制御
findWindow = lambda: pywinauto.findwindows.find_windows(title='開く')[0]
dialog = pywinauto.timings.wait_until_passes(5, 1, findWindow)
pwa_app = pywinauto.Application()
pwa_app.connect(handle=dialog)
window = pwa_app['開く']
window.wait('ready')
# ファイル入力(Alt+N)
pywinauto.keyboard.send_keys("%N")
edit = window.Edit4
edit.wait('ready', timeout=3) # 安定化のため待機
# **前回の入力をクリア**
edit.type_keys("^a{BACKSPACE}") # Ctrl + A → Backspace で全削除
time.sleep(0.2) # 短い待機(高速化のため0.2秒)
# **新しいパスを入力**
edit.set_text(filepath)
time.sleep(0.5) # 入力が確実に反映されるように待つ
try:
# 最前面に持ってくるためにウィンドウにメッセージを送る
window.send_message(win32defines.WM_SYSCOMMAND, win32defines.SC_RESTORE)
# ダイアログの「開く」ボタンをクリック
button = window['開く(&O):']
button.wait('visible', timeout=3) # ボタンが表示されるまで待つ
# ボタンにフォーカスを当てる
button.set_focus()
# ボタンをクリック
button.click()
button.click()
button.click()
print(f"[INFO] 開くボタンをクリック成功")
except (pywinauto.findbestmatch.MatchError, pywinauto.timings.TimeoutError) as e:
print(f"[WARN] 開くボタンのクリック失敗(2回目クリック不要だった)")
time.sleep(0.5) # 少し待ってから再試行
except Exception as e:
print(f"[ERROR] 予期せぬエラー: {e}")
time.sleep(0.5)