Selenium等待下载?

时间:2010-10-12 17:50:59

标签: unit-testing selenium selenium-rc

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

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

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

我该怎么办?

6 个答案:

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

答案 1 :(得分:5)

所以你有两个问题:

  1. 您需要让浏览器下载文件
  2. 您需要测量下载的文件何时完成
  3. 这两个问题都不能由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群组,我绝对可以为您指明正确的方向。
    3. 希望能帮助您识别各种选择。祝你好运!

答案 2 :(得分: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与浏览器停止有关。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

* Ruby语法