別のページから大量のファイルをダウンロードするタスクを自動化するために、Seleniumとpythonを介してchromewebdriver(windows)を使用しています。私のコードは機能しますが、解決策は理想からはほど遠いです。下記の関数は、Javaファイルを生成するスクリプト関数、PDFファイルをダウンロードしてからダウンロードする。
ダウンロードが完了するのを待つために静的な待機を使用する必要がありました(ugい)マルチスレッドを使用しているため(異なるページから多くのファイルをダウンロードしているため、ダウンロードの完了を確認するためにファイルシステムを確認できません)同時に)ファイルの名前もウェブサイト自体で動的に生成されます。
私のコード:
def file_download(num, drivervar):
Counter += 1
try:
drivervar.get(url[num])
download_button = WebDriverWait(drivervar, 20).until(EC.element_to_be_clickable((By.ID, 'download button ID')))
download_button.click()
time.sleep(10)
except TimeoutException: # Retry once
print('Timeout in thread number: ' + str(num) + ', retrying...')
.....
Webdriverでダウンロード完了を判断することは可能ですか? time.sleep(x)の使用を避けたい。
どうもありがとう。
ドライバーを使用してchrome://downloads/
ナビゲーションすると、各ダウンロードのステータスを取得できます。
すべてのダウンロードが完了するのを待ち、すべてのパスをリストするには:
def every_downloads_chrome(driver):
if not driver.current_url.startswith("chrome://downloads"):
driver.get("chrome://downloads/")
return driver.execute_script("""
var items = downloads.Manager.get().items_;
if (items.every(e => e.state === "COMPLETE"))
return items.map(e => e.fileUrl || e.file_url);
""")
# waits for all the files to be completed and returns the paths
paths = WebDriverWait(driver, 120, 1).until(every_downloads_chrome)
print(paths)
私は同じ問題を抱えており、解決策を見つけました。ダウンロードフォルダに.crdownloadがあるかどうかを確認できます。ダウンロードフォルダーに.crdownload拡張子を持つファイルのインスタンスが0個ある場合、すべてのダウンロードが完了します。これは、chromeおよびクロムと思われます。
def downloads_done():
for i in os.listdir("data/"):
if ".crdownload" in i:
time.sleep(0.5)
downloads_done()
Downloads_done()を呼び出すたびに、すべてのダウンロードが完了するまでループします。 80ギガバイトのような大容量のファイルをダウンロードする場合は、関数が最大再帰深度に達する可能性があるため、これはお勧めしません。
テスト自動化を使用する場合、開発者がソフトウェアをテスト可能にすることが重要です。ソフトウェアをテスト可能性と組み合わせてチェックするのはあなたの仕事です。つまり、ダウンロードが正常に完了したことを示すスピナーまたは単純なHTMLタグを要求する必要があります。
あなたの場合、UIでそれをチェックできず、システムでチェックインできない場合、これはそれを解決する最良の方法です。