Selenium等待下载?

问题描述 投票:9回答:6

我正在尝试测试一段需要很长时间才能响应的代码的快乐路径,然后开始将文件写入响应输出流,这会在浏览器中提示下载对话框。

问题是这个过程在过去失败了,在这么长时间的工作之后抛出了异常。有没有一种方法在硒到wait-for-download或同等?

我可以投入一个Thread.sleep,但这将是不准确的,并且不必要地减慢测试运行速度。

我该怎么办?

unit-testing selenium selenium-rc
6个回答
5
投票

所以你有两个问题:

  1. 您需要使浏览器下载该文件
  2. 您需要测量下载的文件何时完成

这两个问题都不能由Selenium直接解决(但是 - 2.0可能会有所帮助),但两者都是可解决的问题。第一个问题可以通过GUI自动化工具包解决,例如AutoIT。但它们也可以通过简单地在操作系统级别发送模拟输入键的自动按键来解决(适用于Firefox,在某些版本的Chrome和Safari上稍微有点难度)。如果您使用的是Java,则可以使用Robot来执行此操作。其他语言有类似的工具包来做这样的事情。

第二个问题可能最好通过某种代理解决方案来解决。例如,如果您的浏览器配置为通过代理并且该代理具有API,则可以使用该API查询代理以询问网络活动何时结束。

这就是我们在http://browsermob.com所做的事情,这是一家我创立的创业公司,它使用Selenium进行负载测试。我们已经发布了一些代理代码作为开源代码,可以在http://browsermob.com/tools上找到。

但是仍然存在两个问题:

  1. 您需要配置浏览器以使用代理。在Selenium 2中,这更容易,但也可以使用Selenium 1。关键是确保您的浏览器启动器使用正确的配置文件/设置启动浏览器。
  2. 目前没有用于BrowserMob代理的API可以告诉您网络流量何时停止!这是项目概念中的一个大漏洞,我想尽快解决这个问题。但是,如果您渴望提供帮助,请加入Google群组,我绝对可以为您指明正确的方向。

希望能帮助您识别各种选择。祝你好运!


7
投票

我有同样的问题。我发明了一些东西来解决问题。 tempt文件由Python创建,扩展名为“.part”。所以,如果我们还有temp,python可以等待10秒,然后再次检查文件是否已下载。

 while True:
        if os.path.isfile('ts.csv.part'):
            sleep(10)
        elif os.path.isfile('ts.csv'):
            break
        else:
            sleep(10)
 driver.close()

4
投票

这是Chrome测试专用的解决方案,可通过javascript控制下载。

使用WebDriver(Selenium2)可以在Chrome的chrome:// HTML / CSS / Javascript中完成:

driver.get( "chrome://downloads/" );
waitElement( By.CssSelector("#downloads-summary-text") );

// next javascript snippet cancels the last/current download
// if your test ends in file attachment downloading 
// you'll very likely need this if you more re-instantiated tests left
((JavascriptExecutor)driver).executeScript("downloads.downloads_[0].cancel_();");

“chrome://downloads/downloads.js”中还有其他Download.prototype.functions

如果您只需要测试一些信息,例如,这可以为您提供套件。由文件附件启动活动引起的,而不是文件本身。

当然,您需要控制步骤1. - 由Patrick above提及 - 并由此控制步骤2.对于测试,而不是实际文件下载完成/取消的功能。

另请参阅:Javascript: Cancel/Stop Image Requests与浏览器停止有关。


0
投票

这属于“无法自动化的事物”类别。 Selenium是使用JavaScipt构建的,由于JavaScript沙箱限制,它无法访问下载。

一旦实施了警报/提示,Selenium 2可能就能做到这一点,但是在接下来的一段时间内不会发生这种情况。


0
投票

如果要检查下载对话框,请尝试使用AutoIt。我使用它来上传和下载文件。使用AutoIt和Se RC更容易。


0
投票
def file_downloaded?(file)
    while File.file?(file) == false
      p "File downloading in progress..."
      sleep 1
    end
end

* Ruby语法

© www.soinside.com 2019 - 2024. All rights reserved.