2010-10-12 106 views
9

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

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

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

我该怎么做,在这里?

回答

5

所以,你这里有两个问题:

  1. 你需要使浏览器下载
  2. 你需要测量下载的文件是完整的

时既不problemc文件的是直接由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. 目前没有API BrowserMob代理告诉你何时网络流量已停止!这是该项目概念中的一个大漏洞,我希望尽快解决这个问题。但是,如果您热衷于帮助,请加入Google群组,我绝对可以将您指向正确的方向。

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

0

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

Selenium 2可能能够做到这一点警报/提示已经实施,但这不会发生在接下来的一段时间。

+1

现在怎么样?这仍然不可能吗? – user942640 2015-07-02 11:30:20

0

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

4

这是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_();"); 

还有其他Download.prototype.functions在 “铬://downloads/downloads.js”

这套房你,如果你只需要测试一些信息,例如。由文件附件启动活动引起,而不是文件本身。

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

另请参阅:Javascript: Cancel/Stop Image Requests这是关于浏览器停止。

8

我有同样的问题。我发明了一些东西来解决问题。一个诱惑文件由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() 
+0

在这个答案和Santeri之间,你确实可以完成你需要的一切。 – Yablargo 2017-04-03 17:25:36