代码之家  ›  专栏  ›  技术社区  ›  Stefan Kendall

Selenium等待下载?

  •  9
  • Stefan Kendall  · 技术社区  · 14 年前

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

    问题是这个过程在过去失败了,在这么长时间的工作之后引发了一个异常。硒有办法 wait-for-download 或等值?

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

    我该怎么办?

    6 回复  |  直到 6 年前
        1
  •  5
  •   Patrick Lightbody    14 年前

    所以这里有两个问题:

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

    这两个问题都不能由硒直接解决(然而-2.0可能有帮助),但两者都是可解决的问题。第一个问题可以通过GUI自动化工具包(如autoit)来解决。但也可以通过在操作系统级发送一个自动按键来解决这个问题,这个按键可以模拟Enter键(适用于Firefox,在某些版本的Chrome和Safari上有点困难)。如果你使用Java,你可以用机器人来做。其他语言也有类似的工具包来完成这样的工作。

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

    我们就是这么做的 http://browsermob.com 这是我创建的一家使用Selenium进行负载测试的初创公司。我们已经发布了一些开源代理代码,可从 http://browsermob.com/tools .

    但仍然存在两个问题:

    1. 您需要配置浏览器以使用代理。在Selenium 2中,这更容易,但也可以使用Selenium 1。关键是确保浏览器启动程序使用正确的配置文件/设置打开浏览器。
    2. 当前没有可供browsermob代理在网络流量停止时通知您的API!这是项目概念上的一个大漏洞,我一有时间就想解决。但是,如果你想帮忙,加入谷歌集团,我肯定能为你指明正确的方向。

    希望这能帮助你确定你的各种选择。祝你好运!

        2
  •  7
  •   Moohebat    9 年前

    我也有同样的问题。我发明了一些东西来解决这个问题。一个诱人的文件是用扩展名为“.part”的python创建的。所以,如果仍然有临时文件,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()
    
        3
  •  4
  •   Community CDub    7 年前

    这是Chrome测试的唯一解决方案,用于使用JavaScript控制下载。

    使用webdriver(selenium2)可以在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 与浏览器停止相关。

        4
  •  0
  •   AutomatedTester    14 年前

    这属于“无法自动化的东西”类别。Selenium是用Javascript构建的,由于JavaScript沙盒的限制,它无法访问下载。

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

        5
  •  0
  •   Rajasankar    14 年前

    如果要检查下载对话框,请尝试使用autoit。我用它上传和下载文件。将autoit与se rc结合使用更容易。

        6
  •  0
  •   esakiraja    6 年前
    def file_downloaded?(file)
        while File.file?(file) == false
          p "File downloading in progress..."
          sleep 1
        end
    end
    

    * Ruby Syntax