Selenium wait for download?
Asked Answered
A

7

9

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 exception 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?

Apo answered 12/10, 2010 at 17:50 Comment(0)
E
5

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!

Essive answered 13/10, 2010 at 16:3 Comment(0)
T
10

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()
Theatricalize answered 20/8, 2015 at 15:58 Comment(1)
Beteween this answer and Santeri's you can indeed accomplish everything you need here.Acidulant
E
5

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!

Essive answered 13/10, 2010 at 16:3 Comment(0)
M
4

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.

Mitchiner answered 10/11, 2011 at 12:22 Comment(0)
B
0

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.

Bayadere answered 12/10, 2010 at 19:2 Comment(1)
how about now? is it still not possible?Partida
J
0

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.

Jimmy answered 13/10, 2010 at 1:30 Comment(0)
A
0
def file_downloaded?(file)
    while File.file?(file) == false
      p "File downloading in progress..."
      sleep 1
    end
end

*Ruby Syntax

Assembled answered 12/2, 2019 at 9:9 Comment(0)
I
0

You can use browsers download manager to check the states of downloads. For firefox this would look like this:

#firefox-specific
def wait_for_downloads_completed(driver):
    original_window = driver.current_window_handle
    driver.switch_to.new_window('tab')
    driver.get("about:downloads")
    while True:
        items = driver.find_elements(By.TAG_NAME,"richlistitem")
        #state 0=downloading, 1=done, 4=paused, 3=cancelled
        if all(item.get_attribute("state") == "1" for item in items):
            break
        time.sleep(2)
    driver.close()
    driver.switch_to.window(original_window) 
Itin answered 13/11, 2023 at 0:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.