开发者

Selenium wait for download?

开发者 https://www.devze.com 2023-01-20 04:18 出处:网络
I\'m trying to test the happy-path for a piece of code which takes a long time to respond, and then begins writing a file to the response output stream, which prompts a download dialog in browsers.

I'm trying to test the happy-path for a piece of code which takes a long time to respond, and then begins writing a file to the response output stream, which prompts a download dialog in browsers.

The problem is that this process has failed in the past, throwing an e开发者_运维百科xception after this long amount of work. Is there a way in selenium to wait-for-download or equivalent?

I could throw in a Thread.sleep, but that would be inaccurate and unnecessarily slow down the test run.

What should I do, here?


I had the same problem. I invented something to solve the problem. A tempt file is created by Python with '.part' extension. So, if still we have the temp, python can wait for 10 second and check again if the file is downloaded or not yet.

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


So you have two problems here:

  1. You need to cause the browser to download the file
  2. You need to measure when the downloaded file is complete

Neither problemc an be directly solved by Selenium (yet - 2.0 may help), but both are solvable problems. The first problem can be solved by GUI automation toolkits, such as AutoIT. But they can also be solved by simply sending an automated keypress at the OS level that simulates the enter key (works for Firefox, a little harder on some versions of Chrome and Safari). If you're using Java, you can use Robot to do that. Other languages have similar toolkits to do such a thing.

The second issue is probably best solved with some sort of proxy solution. For example, if your browser was configured to go through a proxy and that proxy had an API, you could query the proxy with that API to ask when network activity had ended.

That's what we do at http://browsermob.com, which is a a startup I founded that uses Selenium to do load testing. We've released some of the proxy code as open source, available at http://browsermob.com/tools.

But two problems still persist:

  1. You need to configure the browser to use the proxy. In Selenium 2 this is easier, but it's possible to do it with Selenium 1 as well. The key is just making sure that your browser launcher brings up the browser with the right profile/settings.
  2. There currently is no API for BrowserMob proxy to tell you when network traffic has stopped! This is a big hole in the concept of the project that I want to fix as soon as I get the time. However, if you're keen to help out, join the Google Group and I can definitely point you in the right direction.

Hope that helps you identify your various options. Best of luck!


This is Chrome-testing-only solution for controlling the downloads with javascript..

Using WebDriver (Selenium2) it can be done within Chrome's chrome:// which is 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_();");

There are other Download.prototype.functions in "chrome://downloads/downloads.js"

This suites you if you just need to test some info note eg. caused by file attachment starting activity, and not the file itself.

Naturally you need to control step 1. - mentioned by Patrick above - and by this you control step 2. FOR THE TEST, not for the functionality of actual file download completion / cancel.

See also : Javascript: Cancel/Stop Image Requests which is relating to Browser stopping.


This falls under the "things that can't be automated" category. Selenium is built with JavaScipt and due to JavaScript sandbox restrictions it can't access downloads.

Selenium 2 might be able to do this once Alerts/Prompts have been implemented but that this won't happen for the next little while yet.


If you want to check for the download dialog, try with AutoIt. I use that for uploading and downloading the files. Using AutoIt with Se RC is easier.


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

*Ruby Syntax

0

精彩评论

暂无评论...
验证码 换一张
取 消