【问题标题】:Ruby / Watir-Webdriver - Cannot access the file after downloading itRuby / Watir-Webdriver - 下载后无法访问文件
【发布时间】:2016-10-08 05:57:18
【问题描述】:

我正在开发一个从网站下载文件并将其添加到文件夹的测试场景。 对于下载部分,我使用的是 Watir 文档中 browser-downloads 页面上描述的代码。 在等待文件下载时,我的测试中遇到了主要问题:

    def verify_csv_file_exists
     path = Dir.getwd + "/downloads/"
     until File.exist?("#{path}*.csv") == true
      sleep 1
     end 
    end

在运行测试时,上面的过程永远不会停止,因为它看不到目录中的文件,尽管文件已下载。

有谁知道我可以如何处理这种情况?

谢谢。

【问题讨论】:

    标签: ruby watir-webdriver


    【解决方案1】:

    您只需在下载文件之前检查目录内容,然后等待目录中添加了新文件(通过将当前内容与之前的内容进行比较)。这是获取新文件名的方式:

    这应该可以完成工作:

    require 'watir-webdriver'
    
    file_name = nil
    download_directory = "#{Dir.pwd}/downloads"
    download_directory.gsub!("/", "\\") if Selenium::WebDriver::Platform.windows?
    downloads_before = Dir.entries download_directory
    
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile['browser.download.folderList'] = 2 # custom location
    profile['browser.download.dir'] = download_directory
    profile['browser.helperApps.neverAsk.saveToDisk'] = "text/csv,application/pdf"
    
    b = Watir::Browser.new :firefox, :profile => profile
    
    b.goto 'https://dl.dropbox.com/u/18859962/hello.csv'
    
    30.times do
      difference = Dir.entries(download_directory) - downloads_before
      if difference.size == 1
        file_name = difference.first 
        break
      end  
      sleep 1
    end
    raise "Could not locate a new file in the directory '#{download_directory}' within 30 seconds" if not file_name
    puts file_name
    

    【讨论】:

    • 非常感谢阿利斯特。您的解决方案可以完成工作:)
    【解决方案2】:

    您不能将“glob”与File.exists? 一起使用,例如File.exists?("*.csv")。它检查名为*.csv 的文件是否存在,而不是任何名称以.csv 结尾的文件。您应该使用确切的文件名来检查文件是否存在。

    【讨论】:

    • 问题是文件名包含一个唯一编号,该编号是在点击下载链接时生成的。现在有办法得到这个数字:|,所以我用这个方法来查看文件夹中是否存在文件。
    • 我的意思是,如果文件不存在,那么无限睡眠循环将无济于事。
    • 文件在那里,已下载...但是,在测试运行期间,ruby 看不到该文件。即使我运行代码来显示目录中的所有文件(下载完成后),它也不会返回任何内容-> path = Dir.getwd + "/downloads/" Dir.glob("#{path}*.csv ").每个 { |f|放 f }
    【解决方案3】:

    试试这样吧:

    Dir.glob('downloads/*.csv').any?
    

    还有 1 秒钟的睡眠应该如何改变什么?这是多线程应用吗?

    【讨论】:

    • 我试过了,还是不行。我几乎尝试了所有方法。测试运行时下载的文件似乎无法访问。
    • 或者,更准确地说,测试期间下载的文件是不可见的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多