2012-01-11 14 views
9

Używam Watir-Webdriver z Firefoksem i metody zalecanej na stronie watirwebdriver.com do automatyzacji pobierania plików. Wiąże się to z ustawianiem FireFoxa na temat: parametrów konfiguracyjnych, aby wyłączyć okno dialogowe pobierania w FireFox dla określonych typów plików. Działa to dobrze, ale teraz próbuję ustalić, jak najlepiej określić, kiedy pobieranie pliku zostało zakończone (niektóre trwają kilka sekund, a niektóre zajmują kilka minut), więc mogę wylogować się z witryny i przejść do następnego testu. Wygląda na to, że w przeglądarce nie ma już żadnych wizualnych wskazówek, może będę musiał monitorować plik w katalogu pobierania. Wszelkie opcje będą mile widziane.Watir-Webdriver Zaczekaj, aż pobieranie zakończy się

Odpowiedz

2

Być może możesz śledzić rozmiar pliku, aby zobaczyć, kiedy przestanie się zmieniać na kilka sekund.

+0

To prawie jedyne rozwiązanie, które znalazłem. To niezbyt satysfakcjonujące, ponieważ muszę śledzić plik, biorąc pod uwagę, jak Firefox obsługuje pobieranie. Działa, ale nie jest przenośny podczas sterowania inną przeglądarką. – user1142012

+0

Możesz także napotkać problemy, gdy masz mniej stabilne połączenie sieciowe. – encoded

1

Mam nieco inne podejście do automatyzacji pobierania plików. robię to tak:

W requiures:

require 'rubygems' 
require 'watir-webdriver' 
require 'win32ole' 

najpierw utworzyć metodę obchodzenia Wielkość pliku:

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 

drugie jazdy chrom z wcześniej ustalonym-up pobierania reż:

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 

Następnie usuń plik (z poprzednich serii) dla przypadku testowego ponownego użycia i validness (jeden z 3):

%x(DEL /Q C:\\automation\\qa\\downloads\\*.exe) 
%x(DEL /Q downloads\\*.exe) 
%x(DEL /Q downloads\\*.*) 

Zdefiniuj zmienną wielkość pobranego składnika:

contains = Dir.new(download_directory).entries 
dlc = contains[2] 
dcinfo = fileinfo("downloads/"+dlc) 
dlcsize = File.size("downloads/"+dlc) 

I wreszcie można uwzględnić punkt Walidacja:

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

Nie podobało mi się tylko patrzenie na rozmiar pliku, czułem się kruchy, więc w końcu użyłem polecenia lsof, aby wykryć, kiedy nie ma procesów, które trzymają plik otwarty, a potem czytałem plik. Lepiej jest, aby przerwa w pobieraniu z powodu czkawki sieci nie powodowała sporadycznych błędów, ale gorzej (?), Ponieważ nie jest przenośna i uruchamia polecenie lsof.

Zakodowany wyglądał mniej więcej tak:

# 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

Chrome zapisuje niedokończone pliki do pobrania z dodatkiem .crdownload rozszerzenia pliku. Sprawdź, czy katalog ma pobieranie pliku o rozszerzeniu .crdownload i że powinien powiedzieć, czy nadal trwa pobieranie

0

Sposób, w jaki sobie z tym poradzić, jest następujący

Firefox ściągnąć pliki kończą .part

po pobraniu wszystkie nazwy plików są pobierane na listę ".część”do nich przechowywać na pętli na tej liście i sprawdzić, czy któryś z tych plików, nadal istnieje w lsdir folderu pobierania kodu

Python:

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() 

Uwaga: Gdy nie ma żadnych plików part . w os.listdir('.'), co oznacza, że ​​pobieranie jest zakończone

1

miałem podobne zadanie, gdzie chciałem, aby wyodrębnić zawartość pobranego pliku PDF Kiedyś następujące rozwiązanie:

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

Wykonuje 20 prób wydobycia tekstu za pomocą polecenia pdftotext powłoki i wyłamie się z bloku, jeśli polecenie powłoki zakończyło się pomyślnie. Zaletą robienia tego w ten sposób jest to, że jeśli plik nie istnieje lub plik jest tylko częściowo pobrany, wygeneruje błąd, a następnie spróbuje ponownie. Jeśli twój plik nie jest plikiem PDF lub nie dbasz o jego zawartość, użyjesz innego polecenia powłoki zamiast pdftotextu, o ile spowoduje to błąd, jeśli plik jest niekompletny.

Powiązane problemy