私は、FirefoxでWatir-Webdriverを使用しており、watirwebbriver.comサイトで推奨されている方法でファイルのダウンロードを自動化しています。これには、FireFoxのabout:configパラメータを設定して、特定のファイルタイプのFireFoxのダウンロードダイアログを無効にします。これはうまくいきましたが、ファイルのダウンロードが完了した時点(いくつかは数秒かかることもあれば数分かかる)を判断して、サイトをログアウトして次のテストに進む方法を見つけようとしています。ブラウザに視覚的な手がかりが残っていないので、ダウンロードディレクトリのファイルを監視する必要があるかもしれません。任意のオプションをいただければ幸いです。Watir-Webdriverダウンロードが完了するまで待つ
答えて
多分、ファイルサイズが数秒間変化しなくなるのを見ることができます。
私は、ファイルダウンロードの自動化には少し違ったアプローチがあります。 私はこのようにそれを行う:
requiures:
require 'rubygems'
require 'watir-webdriver'
require 'win32ole'
まずファイルサイズ処理するための方法を作成します。
def fileinfo(name)
if File.exists?(name)
print "#{name} exists "
bytes = File.size(name)
print "and is #{bytes} in size;"
whenm = File.mtime(name)
print whenm,";"
print whenm.to_i,";"
else
print "#{name} does NOT exist;"
end
end
第二に、事前のセットアップのダウンロードディレクトリを使ってChromeドライブ:
download_directory = "#{Dir.pwd}/downloads"
download_directory.gsub!("/", "\\") if Selenium::WebDriver::Platform.windows?
profile = Selenium::WebDriver::Chrome::Profile.new
profile['download.prompt_for_download'] = false
profile['download.default_directory'] = download_directory
次のテストケースのファイルを削除します(以前の実行から)。再利用性および有効度(3の1):
%x(DEL /Q C:\\automation\\qa\\downloads\\*.exe)
%x(DEL /Q downloads\\*.exe)
%x(DEL /Q downloads\\*.*)
ダウンロードしたコンポーネントのサイズの変数を定義します
contains = Dir.new(download_directory).entries
dlc = contains[2]
dcinfo = fileinfo("downloads/"+dlc)
dlcsize = File.size("downloads/"+dlc)
をそして最後に、あなたは、検証ポイント含めることができます。
if dlcsize > 0
puts "File found and is #{dlcsize} bytes."
logfile = open("test_results.csv", "a")
begin
logRow = "#{__FILE__}"
logfile.puts logRow + "," + "Passed".to_s
end
else
puts "Test Failed! File not found either is zero."
logfile = open("test_results.csv", "a")
begin
logRow = "#{__FILE__}"
logfile.puts logRow + "," + "Passed".to_s
end
end
を私はちょうどファイルサイズを見て好きではなかった、それは壊れやすいと感じたので、私はlsofコマンドを使用して、ファイルを開いているプロセスが存在しないことを検出し、ファイルを読み終えました。ネットワークの不具合のためにダウンロードが一時停止しても間欠的なエラーは発生しませんが、lsofコマンドではポータブルではないという点で悪化します(?)。
# Watch the download dir for new files, and read the first new file that
# appears.
def read_newest_download
existing_files = list_files_in_download_dir
new_files = []
Timeout::timeout(DOWNLOAD_TIMEOUT) do
while (new_files = list_files_in_download_dir - existing_files).empty?
sleep 0.25
end
end
if 1 == new_files.size
wait_for_file_to_be_closed(new_files.first)
File.read(new_files.first)
else
fail "Found #{new_files.size} new files."
end
end
# Ignore files ending in .part, which is common for temp files in Firefox.
def list_files_in_download_dir
raise ArgumentError, "No download dir specified" unless @opts[:download_dir]
@_download_glob ||= File.join(@opts[:download_dir], "*")
# Ignore files ending in .part as they're temporary files from Firefox.
Dir[@_download_glob].entries.reject {|e| /\.part$/ === e}
end
def wait_for_file_to_be_closed(filename)
begin
sleep 0.25
end until `lsof #{filename}`.blank?
end
クローム店追加.crdownload
ファイル拡張子を持つ未完了のダウンロード:コード化された
はこのような何かを見ました。ダウンロードディレクトリが.crdownload
で終わるファイルがあるかどうかを確認し、ダウンロードがまだ私はこれを処理
道継続中である場合、それはあなたを教えてください、次
Firefoxはファイルが.part
で終わるダウンロードされますすべてのファイルの名前が追加後に一覧にダウンロードされています。それらの一部は、」そのリスト上でループし続けると、これらのファイルのいずれかがまだダウンロードフォルダ
Pythonコードの lsdirに存在するかどうかを確認 :
import os
import time
def wait_till_download():
if len(new_part_files) > 0:
time.sleep(1)
for part_file in new_part_files:
if part_file in os.listdir("."):
print "Downloading..."
wait_till_download()
注記:一部のファイルが存在しませんos.listdir('.')
で、それはダウンロードが
を終えていることを意味、私は私がダウンロードしたPDFファイルの内容を抽出したかった同様のタスクを持っていた私は解決策を次のように使用:。
t = ''
(0..19).each do
sleep 5
t = `pdftotext -raw some_directory/*.pdf -`
break if $?.success?
end
シェルコマンドpdftotextを使用してテキストの抽出を20回試行し、シェルコマンドが成功した場合はブロックから抜け出します。この方法の利点は、ファイルが存在しない場合、またはファイルが部分的にしかダウンロードされていない場合は、エラーが発生してから再試行することです。あなたのファイルがPDFでないか、内容が気にしない場合は、ファイルが不完全な場合にエラーを生成する限り、pdftotextの代わりに別のシェルコマンドを使用します。
- 1. ダウンロードの完了を待つ方法は?
- 2. コマンドが完了するまで待つ
- 3. UWP:invokeScriptAsyncが完了するまで待つ
- 4. タスクが完了するまで待つ
- 5. application.runが完了するまで待つ
- 6. jQueryが完了する前にアニメーションが完了するまで待つ
- 7. サブスクリプションが完了するのを待つ
- 8. フレックスエフェクトが完了するのを待つ
- 9. 結果バックエンドなしでセロリタスクが完了するまで待つ
- 10. Slickで文の実行が完了するまで待つ
- 11. ForループでBukkitタスクが完了するまで待つ
- 12. グレースフルnode.jsのシャットダウンでクリティカルセクションが完了するまで待つ
- 13. Python + Selenium + Firefoxでダウンロードが完了するまでお待ちください
- 14. NSURLConnectionの完了を待つ
- 15. VBA:BloombergのBDP呼び出しが完了するまで待つ
- 16. 操作が完了するまで待つ
- 17. assetForURLブロックが完了するまで待つ
- 18. UIフリーズのない計算が完了するまで待つ
- 19. AngularJSタイムアウトの関数が完了するまで待つ
- 20. IEからのファイルダウンロードが完了するまで待つVBAコード
- 21. リクエストが完了するまで待つ - Python Scrapy
- 22. Cordova SQLiteは挿入が完了するまで待つ
- 23. Python/Scrapyが完了するまで待つ
- 24. SQLクエリが完了するまで待つNodeJS SQLite 3
- 25. レルムの書き込みが完了するまで待つ
- 26. 観測が完了するまで待つ
- 27. SwingWorkerが完了するまで待つ方法は?
- 28. リアクションコンポーネントの更新が完了するまで待つ
- 29. サーバコールが完了するまでブラウザを待つことができますか?
- 30. APIメソッドはクリティカルメソッドが完了するまで待つ必要があります
これは私が見つけた唯一の解決策です。 Firefoxがダウンロードをどのように処理するかを考慮してファイルを追跡しなければならないので、これはあまり満足できるものではありません。それは動作しますが、別のブラウザを制御するときは移植できません。 – user1142012
ネットワーク接続が安定していないときにも問題が発生することがあります。 – encoded