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