2012-01-11 92 views
9

我正在使用Watir-Webdriver和Firefox以及watirwebdriver.com网站上推荐的方法来自动执行文件下载。这包括设置FireFox about:config参数以禁用FireFox中的特定文件类型的下载对话框。这很好,但现在我试图找出如何最好地确定文件下载何时完成(有些需要几秒钟,有些需要几分钟),所以我可以注销站点并转到下一个测试。因为浏览器中没有可视的线索,所以我可能不得不在下载目录中监视文件。任何选项将不胜感激。Watir-Webdriver等待下载完成

回答

2

也许你可以跟踪文件大小,看看它何时停止改变几秒钟。

+0

这几乎是我找到的唯一解决方案。这不是很令人满意,因为我必须跟踪文件,了解Firefox如何处理下载。它可以工作,但在控制不同的浏览器时不可移植。 – user1142012 2012-01-26 05:03:44

+0

当您的网络连接不稳定时,您也可能遇到问题。 – encoded 2012-11-16 22:43:49

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 

其次开车铬与预先设定的加快下载目录:

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一个):

%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

Chrome储存在未完成下载与添加.crdownload文件扩展名。请检查是否下载目录中有.crdownload结尾的文件,这应该告诉你,如果一个下载仍在进行中

0

我处理这个问题的方式,是下列

Firefox下载文件有。部分

结束

已将所有文件的名称在追加后下载到列表中。部分”他们 不断循环在名单上,并检查是否有这些文件的 lsdir下载文件夹

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

注:当没有部分文件在os.listdir('.'),这意味着下载完成

1

我有一个类似的任务,我想提取下载的PDF文件的内容,我用以下解决方案:

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

它在使用shell命令pdftotext提取文本时会执行20次尝试,并且如果shell命令成功,将跳出该块。这样做的好处是,如果文件不存在或文件只是部分下载,将会产生错误,然后重试。如果您的文件不是PDF或者您不关心内容,那么您可以使用另一个shell命令而不是pdftotext,只要文件不完整就会产生错误。