【问题标题】:Watir-Webdriver Wait for Download to CompleteWatir-Webdriver 等待下载完成
【发布时间】:2012-01-11 00:44:46
【问题描述】:

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

【问题讨论】:

    标签: watir-webdriver


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这几乎是我找到的唯一解决方案。这不是很令人满意,因为考虑到 Firefox 处理下载的方式,我必须跟踪文件。它可以工作,但在控制不同的浏览器时不可移植。
      • 网络连接不稳定时也可能会遇到问题。
      【解决方案3】:

      我不喜欢只看文件大小,感觉它很脆弱,所以我最终使用 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
      

      【讨论】:

        【解决方案4】:

        我有一个类似的任务,我想提取下载的 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】:

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

          要求:

          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
          

          第二次用预先设置的下载目录驱动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
          

          【讨论】:

            【解决方案6】:

            我的处理方式如下

            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('.')中没有part文件时,表示下载完成

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-04
              • 1970-01-01
              • 1970-01-01
              • 2014-01-03
              • 2023-01-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多