2012-01-11 12 views
9

私は、FirefoxでWatir-Webdriverを使用しており、watirwebbriver.comサイトで推奨されている方法でファイルのダウンロードを自動化しています。これには、FireFoxのabout:configパラメータを設定して、特定のファイルタイプのFireFoxのダウンロードダイアログを無効にします。これはうまくいきましたが、ファイルのダウンロードが完了した時点(いくつかは数秒かかることもあれば数分かかる)を判断して、サイトをログアウトして次のテストに進む方法を見つけようとしています。ブラウザに視覚的な手がかりが残っていないので、ダウンロードディレクトリのファイルを監視する必要があるかもしれません。任意のオプションをいただければ幸いです。Watir-Webdriverダウンロードが完了するまで待つ

答えて

2

多分、ファイルサイズが数秒間変化しなくなるのを見ることができます。

+0

これは私が見つけた唯一の解決策です。 Firefoxがダウンロードをどのように処理するかを考慮してファイルを追跡しなければならないので、これはあまり満足できるものではありません。それは動作しますが、別のブラウザを制御するときは移植できません。 – user1142012

+0

ネットワーク接続が安定していないときにも問題が発生することがあります。 – encoded

1

私は、ファイルダウンロードの自動化には少し違ったアプローチがあります。 私はこのようにそれを行う:

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 
2

を私はちょうどファイルサイズを見て好きではなかった、それは壊れやすいと感じたので、私は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 
2

クローム店追加.crdownloadファイル拡張子を持つ未完了のダウンロード:コード化された

はこのような何かを見ました。ダウンロードディレクトリが.crdownloadで終わるファイルがあるかどうかを確認し、ダウンロードがまだ私はこれを処理

0

道継続中である場合、それはあなたを教えてください、次

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('.')で、それはダウンロードが

1

を終えていることを意味、私は私がダウンロードしたPDFファイルの内容を抽出したかった同様のタスクを持っていた私は解決策を次のように使用:。

t = '' 
(0..19).each do 
    sleep 5 
    t = `pdftotext -raw some_directory/*.pdf -` 
    break if $?.success? 
end 

シェルコマンドpdftotextを使用してテキストの抽出を20回試行し、シェルコマンドが成功した場合はブロックから抜け出します。この方法の利点は、ファイルが存在しない場合、またはファイルが部分的にしかダウンロードされていない場合は、エラーが発生してから再試行することです。あなたのファイルがPDFでないか、内容が気にしない場合は、ファイルが不完全な場合にエラーを生成する限り、pdftotextの代わりに別のシェルコマンドを使用します。

関連する問題