Watir-Webdriver等待下载完成

时间:2012-01-11 00:44:46

标签: watir-webdriver

我正在使用Watir-Webdriver和Firefox以及watirwebdriver.com网站上推荐的方法来自动化文件下载。这涉及设置FireFox about:config参数以禁用FireFox中针对特定文件类型的下载对话框。这很好,但现在我想弄清楚如何最好地确定文件下载何时完成(有些需要几秒钟,有些需要几分钟),所以我可以退出网站并继续下一个测试。似乎由于浏览器中没有剩余的视觉线索,我可能需要监视下载目录中的文件。任何选项将不胜感激。

6 个答案:

答案 0 :(得分:2)

也许您可以跟踪文件大小以查看它何时停止更改几秒钟。

答案 1 :(得分: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 :(得分:2)

Chrome会使用添加的.crdownload文件扩展名存储未完成的下载内容。检查下载目录是否有以.crdownload结尾的文件,并且应该告诉您下载是否仍在进行中

答案 3 :(得分:1)

我有一些不同的文件下载自动化方法。 我是这样做的:

要求:

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

首先为Filesize处理创建一个方法:

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

%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

答案 4 :(得分: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,只要它在文件不完整时产生错误。

答案 5 :(得分:0)

我处理这个的方式是以下

Firefox下载文件以.part

结尾

将“.part”附加到列表后,将所有文件的名称下载到列表中 继续在该列表上循环并检查是否仍存在这些文件中的任何一个 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('.')中没有任何部分文件时,表示下载已完成