type="file"に対してSeleniumでアップロードファイルを指定するテストのメモ
テキストボックスのようにsend_keys関数で指定してOK
HTMLの構造
<body>
<form action="./confirm.php" method="POST" enctype="multipart/form-data">
<table border="1">
<tr>
<th>ファイル</th>
<td>
<input name="file" type="file">
</td>
</tr>
</table>
<input name="submit" type="submit" value="送信">
</form>
</body>
何の変哲もないfileアップロードHTMLを想定。
Seleniumでファイルを指定する
elements = driver.find_element(By.XPATH, "//input[@name='file'][@type='file']")
elements.send_keys("ファイルパス")
入力はsend_keysでOK、テキスト入力と同じ感覚で可能です。
注意
存在しないファイルを指定するとエラーするので、念のためチェックしておいた方が親切かと思います。
とりあえず簡単なチェックだけでも。
test_data = "C:\\Users\\ユーザー名\\Desktop\\ファイル名"
if not os.path.isfile(data["file"]):
print("Error:入力項目「file」のテストデータ(" + test_data + ")は、ファイルが存在しません")
else:
elements = driver.find_element(By.XPATH, "//input[@name='file'][@type='file']")
elements.send_keys(test_data)
python初心者地味にハマる
python使い始めて1年たってない人間がつまづいた点がありまして、
ファイル名を指定するとき、Windowsはフォルダを「\]で区切るんですが、これを2重「\\」と表記しないとエラーするってことがわからず、ちょっと時間を使ってしまった。。。
これはエラー
test_data = "C:\Users\ユーザー名\Desktop\ファイル名"
elements = driver.find_element(By.XPATH, "//input[@name='file'][@type='file']")
elements.send_keys(test_data)
しかし外部ファイルから呼び出すときはエラーしない
これはエラーしない
with open("外部データファイル", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter=",")
for line in reader:
elements = driver.find_element(By.XPATH, "//input[@name='file'][@type='file']")
elements.send_keys(line["test_data"]) #変数の中身→C:\Users\ユーザー名\Desktop\ファイル名