Selenium WebDriver: Upload multiple files - java

My test need to upload test files in different browsers (I use WebDriver + Java).
For a single file upload, everything works fine. I just send the path
"C:\\testdata\\testfile.txt"
But, syntax changes for multiple upload and different browsers.
(
IE:
"\"" + "C:\\Selenium\\TestData\\Flexy - BigFile1.txt"+"\"" +"\""+"C:\\Selenium\\TestData\\Flexy - BigFile2.txt" + "\""
CHROME:
"C:\\Selenium\\TestData\\Flexy - BigFile1.txt"+"\n"+"C:\\Selenium\\TestData\\Flexy - BigFile2.txt".
Firefox: I'm not able to find a correct syntax.
Any idea?
Is there a common syntax for all browsers?

As far as I know, selenium still does not support multiple file upload (see issue on google code).
There is at least one workaround: apparently create a form that contains as many input fields as you need (see another stackoverflow question). Not the best solution, as it (probably) requires altering your code for selenium to work.
However, as you have found out (thanks for this!), it does seem possible to trigger multiple file uploads in chrome and (although I did not test it) IE as well.
I just confirmed that the chrome "\n" trick works both locally and on Browserstack (I used the default images they provide), which, considering the state of things, is good enough for me.
I hope this helps.

The solution for me (selenium in python) was to just repeat send_keys for each image path before uploading.
Example for two files:
driver.find_element_by_name("filename").send_keys(file_path_1)
driver.find_element_by_name("filename").send_keys(file_path_2)
driver.find_elements_by_xpath("//*[contains(text(), 'Upload')]")[0].send_keys(Keys.RETURN)

I also get chance to upload multiple files via Selenium.
Finally get the solution using AutoIT.
You can pass file path at run time.
ControlFocus(“File Upload”,””,”Edit1″)
ControlSetText(“File Upload”,””,”Edit1″,$CmdLine[1])
ControlClick(“File Upload”,””,”Button1″)
Runtime.getRuntime().exec("C:\\Users\\Mukesh_50\\Desktop\\My blog\\AutoIT\\fileUpload3.exe"+" "+"C:\\Users\\Mukesh_50\\Downloads\\VerifyTitle.java");
If finding any issue then check complete article with video.

Related

Downloading Files with ChromeDriver

I have a project where I need to download an audio file in ChromeDriver. The behavior here is different from in regular Chrome, where if I visit the URL, it'll automatically start downloading a file. If I do the same thing manually in ChromeDriver, it will not download the file.
I've tried different configurations of the chrome options/preferences. I've also found options that worked with old versions of chrome, that no longer work anymore.
Here is one of the better resources I found, but it still didn't work, even with their updated blog post
https://dkage.wordpress.com/2012/03/10/mid-air-trick-make-selenium-download-files/
When I attempt to use his solution, my chromedriver abruptly crashes itself in a non chrome-esque way. It just disappears. Not "Something went wrong" page like you'd normally expect. I end up with Java not being able to find my Session, cause it stopped existing.
Has anyone been successful at downloading files through Selenium webdriver in Chrome? If I need to use another browser, I can.
I'm currently using Chrome Canary.
I have the same problem. One solution that might work is to use another library, that is able to operate outside of the browser. I found these stackoverflow post discussiong this issue:
https://sqa.stackexchange.com/questions/2197/how-to-download-a-file-using-seleniums-webdriver
it contains this blogpost wich gives you some sugestions.
https://blog.codecentric.de/en/2010/07/file-downloads-with-selenium-mission-impossible/
Window automation
The first approach smells like “brute force”: when searching the net for a solution to the problem, you easily end up with suggestions, to control the native window with some window automation software like AutoIt. Means you have to prepare AutoIt such, that it waits for any browser download dialog, the point at which Selenium is giving up, takes control of the window, saves the file, and closes the window. After that Selenium can continue as usual.
This might eventually work, but I found it to be techical overkill. And as it turned out, there was a much simpler solution to the problem.
Change the browsers default behaviour
The second possibility is to change the default behaviour of the browser. When clicking on a PDF for example, the browser should not open a dialog and ask the user what to do with the file, but rather save it without comments and questions in a predefined directory. To accomplish that, a file download has to be initiated manually, saved to disk and marked as the default behaviour for these file types from now on.
Well, that could work. You “only” have to assure that all developers, hudson instances, etc. share the same browser profile. And depending on the amount of different file types, that could be some manual work.
Direct download
Taking a step back, why do we want to download the file with Selenium in the first place? Wouldn’t it be much cooler, to download the file without Selenium, but rather with wget? You would have solved the second problem as you go. Seems a good idea, since wget is not only available for Linux but also for Windows.
Problem solved? Not quite: what about files, that are not freely accessible? What, when I first need to create some state with Selenium in order to access a generated file? The solution seems ok for public files, but is not applicable for all situations.

Can we check downloading test using Selenium

I came through a scenario where i have to check if someone click a link to download something it is downloading properly.. Using selenium is there anyway i can check if it trigger the downloading by clicking the link??
thanks
With WebDriver you can detect and test any UI changes caused by clicking a link - if the application provides any. E.g. some text appeared your download was started or so.
But you'll need to use another approach to test if actual content was downloaded - e.g. test whether a file with certain name appeared in file system. You cannot do this with WebDriver directly - use Java files I\O or other libs for that.

How to use Selenium WebDriver to Download APK Files

I am trying to download an .apk file using SeleniumWebDriver on FireFox.
I have set the profile to auto-save, but when I click the .apk file download link, it opens the download confirmation dialogue.
How should I proceed moving forward?
Here is my code:
FirefoxProfile fprofile = new FirefoxProfile();
fprofile.setPreference("browser.download.folderList", 2);
fprofile.setPreference( "browser.download.manager.showWhenStarting", false );
fprofile.setPreference("browser.download.dir", "D:\\WebDriverdownloads");
fprofile.setPreference("browser.helperApps.alwaysAsk.force", false);
fprofile.setPreference("browser.helperApps.neverAsk.saveToDisk",
"application/vnd.android.package-archive;"); //MIME Type for APK files
driver = new FirefoxDriver(fprofile);
As far as I know there is no easy way to download files with Selenium because browsers use native dialogs. Check this link.
AutoIT was helpful for me, hope it helps you too.
In my code, I just have following preferences and it works fine. Looks like you do have these options already.
"browser.download.folderList": 2,
"browser.download.dir": "/Users/nilesh",
"browser.helperApps.neverAsk.saveToDisk": "text/csv"
If you search online, people will be posting bunch of solutions using AutoIT and Robot class. I strongly recommend you avoid that. AutoIT to my knowledge is windows only. My experience with Robot didn't give consistent results. So both solutions are flimsy and brittle.
Also if you care about supporting multiple browsers, you would have to deal with this problem on per browser basis and NOT just firefox. I recommend you reading this blog which describes how to download files in Selenium and why you shouldn't. Author of the blog provides a solution in Java on querying for the file using a HTTP Get request. That's the best way to deal with this problem if you want to support multiple browsers.

Selecting folders, not files, in Google Chrome

I'm creating an extension for Google Chrome, so any code has to be compatible with Chrome and Chrome only. In this extension, I need the user to select a folder from his local machine. This simple task is becoming quite a problem. The chrome extensions options page will not run applets, so I couldn't really do Java. It's Google Chrome only so an ActiveX object is out of the question as well. I just need a simple way of selecting a folder(not a file) and passing its path to Javascript. Might this be possible in Flash Actionscript? It seems FileReference and FileReferenceList classes in AS only allow you to choose a file, and not a folder. Is there another possibility besides Flash? All the options page files DO rest on the local users machine, so it's not server side.
Thank you for your time.
You can use the webkit-directory attribute on your element to select directories and get the same sort of result as from the "multiple" attribute.
A demo of this: http://www.thecssninja.com/demo/webkitdirectory/
The chromium bug: http://crbug.com/58977

Does this applet work for you?

I have found a solution to get the full file path of a file that is about to be uploaded using a Java Applet. I need this for an internal system not anything else "dodgy"!
Can anyone confirm if this works in an IE6 browser: http://www.maschek.hu/preview/ffx3_file/filepath.html
I have an IETester application that has IE6/7/8 in one place and all IE6 does is just load/wait for the page and it has been 10 minutes. I am trying to determine if this applet will work in IE6?
Its using PARAM tags so is that a no? This has worked on my IE8.
To get this to work, do I need to do more than change the PARAM tags to Object tags?
Thanks all
Check out this website -->
http://www.spoon.net/browsers/
Its a browser Sandbox. You can run any browser from the web. Very useful stuff.
If you want to test your application in IE6 you could use the Internet Explorer Application Compatibility Virtual PC Images supplied free by Microsoft. This will probably be more reliable than asking other people to do it for you.

Categories