2012-01-11 29 views
9

Tôi đang sử dụng Watir-Webdriver với Firefox và phương pháp được đề xuất trên trang web watirwebdriver.com để tự động tải xuống tệp. Điều này liên quan đến việc thiết lập FireFox về: các tham số cấu hình để vô hiệu hóa hộp thoại tải xuống trong FireFox cho các loại tệp cụ thể. Điều này hoạt động tốt nhưng bây giờ tôi đang cố gắng tìm ra cách tốt nhất để xác định khi tải xuống tệp đã hoàn thành (một số mất vài giây, một số mất vài phút) để tôi có thể đăng xuất trang và chuyển sang bài kiểm tra tiếp theo. Có vẻ như vì không có manh mối trực quan nào trong trình duyệt, tôi có thể phải theo dõi tệp trong thư mục tải xuống. Bất kỳ tùy chọn nào cũng sẽ được đánh giá cao.Watir-Webdriver Chờ tải xuống để hoàn thành

Trả lời

2

Có thể bạn có thể theo dõi kích thước tệp để xem thời điểm nó ngừng thay đổi trong vài giây.

+0

Đó là giải pháp duy nhất mà tôi đã tìm thấy. Nó không phải là rất thỏa mãn vì tôi phải theo dõi các tập tin đưa ra cách Firefox xử lý một tải về. Nó hoạt động nhưng không di động khi điều khiển một trình duyệt khác. – user1142012

+0

Bạn cũng có thể gặp sự cố khi kết nối mạng kém ổn định. – encoded

1

Tôi có một cách tiếp cận hơi khác nhau để tự động tải tệp xuống. tôi làm điều đó như thế này:

Các requiures:

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

Đầu tiên tạo ra một phương pháp cho việc xử lý Dung lượng:

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 

Thứ hai lái xe chrome với trước thiết lập tải dir:

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 

Tiếp theo xóa tệp (từ lần chạy trước đó) cho trường hợp kiểm tra lại khả năng sử dụng và validness (một trong số 3):

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

Xác định các biến kích thước của các thành phần tải về:

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

Và cuối cùng bạn có thể bao gồm các điểm xác nhận:

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

Tôi không thích nhìn vào các tập tin, nó cảm thấy mong manh, vì vậy tôi đã kết thúc bằng cách sử dụng lệnh lsof để phát hiện khi không có quy trình nào đang mở tập tin, và sau đó đọc tệp. Nó tốt hơn trong đó tạm dừng trong tải xuống do trục trặc mạng sẽ không gây ra lỗi liên tục, nhưng tệ hơn (?) Ở chỗ nó không phải là di động và vỏ ra lệnh lsof.

Các mã nhìn một cái gì đó như thế này: tải

# 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 lưu trữ chưa hoàn thành với thêm một phần mở rộng tập tin .crdownload. Kiểm tra xem nếu thư mục tải về có một tệp có đuôi .crdownload và rằng nên cho bạn biết nếu một tải vẫn đang tiếp diễn

0

The way i xử lý này, là sau

Firefox tải file kết thúc với .part

có tất cả tên tệp được tải xuống trong danh sách sau khi thêm ".phần" đối với họ tiếp tục lặp trên danh sách đó và kiểm tra nếu bất kỳ của những tập tin vẫn còn tồn tại trong lsdir của thư mục tải đang

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

lưu ý: khi không có file phần . trong os.listdir('.'), có nghĩa là tải xong

1

tôi đã có một nhiệm vụ tương tự mà tôi muốn trích xuất nội dung của một tập tin PDF tải về tôi từng giải pháp sau đây:

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

Có 20 lần thử trích xuất văn bản bằng cách sử dụng lệnh shell pdftotext và sẽ thoát ra khỏi khối nếu lệnh shell thành công. Ưu điểm của việc làm theo cách này là nếu tệp không tồn tại hoặc nếu tệp chỉ được tải xuống một phần, tệp sẽ tạo ra lỗi và sau đó thử lại. Nếu tệp của bạn không phải là tệp PDF hoặc bạn không quan tâm đến nội dung thì bạn sử dụng một lệnh shell khác thay cho pdftotext, miễn là nó tạo ra lỗi nếu tệp không đầy đủ.

Các vấn đề liên quan