user20408
user20408

Reputation: 709

Interacting with pop-up boxes using selenium in python

I'm trying to use the Selenium module in python to generate a text list from one website, save it in a directory, and browse to that text list on another site to submit it.

I'm working on the script in two parts- 1. Get metadata and 2. Order data. I've successfully completed the script in part 1, except for the very last thing: Choosing to save the metadata file that was just generated. I left it alone to work on part 2, hoping I would stumble upon the answer, but I'm just reaching to same problem when the pop-up to choose file comes along.

In the documentation, I'm told that Selenium WebDriver has built-in support for handling popup dialog boxes and that after triggering a dialog box, if I call alert = driver.switch_to_alert() then I can "accept, dismiss, read its contents, or even type into a prompt."

However, it's not working. When I try alert.text('some text') or alert.send_keys(Keys.TAB), I keep getting the error NoAlertPresentException: Message: No alert is present and after adding the command to wait, I get the error TimeoutException: Message:

Are the popups I'm getting (screenshots attached) not recognized by Selenium? If so, how do I interact with them? It seems like using this to save and/or upload files is something that many people have to do, but I cannot find anything on Google. Specifically, I would like to choose 'Save File' then 'OK' for the first image and for the second I would like to browse to the file (i.e. enter the path into the file name field) and click 'Open.' I don't want to just change my Firefox settings to automatically save because this will eventually be run in a different environment, and that won't help solve my second problem.

Thanks!

EDIT: I'm testing my script on windows but it will eventually be implemented on a linux cloud server. I thought I was going to have to switch to PhantomJS webdriver (which was probably going to make my problem worse) to do headless browsing but I found a way to keep firefox. I guess all this means is that I can't use AutoIT to fix my problem.

save dialog

Upvotes: 4

Views: 9261

Answers (2)

eaccmk
eaccmk

Reputation: 376

Extremely simple implementation using AutoIT.

Below scripts and steps can hely you to click on 'Save>OK' on this window's pop-UP

Step 1: Download AutoIT package/tool here AutoIt You may select ZIP format (extract it)

Step 2: Open any text editor (say notepad) and copy below code and save with extension .au3
(e.g file.au3)

WinWait("[TITLE:Opening ; CLASS:MozillaDialogClass]","", 10)
If WinExists("[TITLE:Opening ; CLASS:MozillaDialogClass]") Then
WinActivate("[TITLE:Opening ; CLASS:MozillaDialogClass]")
Send("{DOWN}")
Sleep(20)
Send("{TAB}")
Sleep(20)
Send("{TAB}")
Sleep(20)
Send("{ENTER}")
EndIf

Step 3: From extracted zip (Step 1) look for folder named: Aut2Exe and open it

Step 4: Click Aut2exe_x64.exe if your OS is 64 bit otherwise click Aut2exe.exe

Step 5: Browse/Locate file created in Step2. (file saved as extension .a3) AND Choose Destination (.exe/.a3x) and select .exe option (say file.exe) AND then Click convert

Step 6: include this file.exe in your project folder and use it as per your requirement using below code (as it is in Eclipse):

driver.dwonload().click(); // it can be something else as per your flow
Runtime.getRuntime().exec("C:/*path_to_your_EXE_file(selected in step 6))*/file.exe");

Upvotes: 0

alecxe
alecxe

Reputation: 473863

The popups you see are not regular popups that can be interacted with using switch_to. These popups are system dialogs and cannot be automated using selenium.

Usually people avoid having these dialogs shown in the first place by tweaking browser preferences, e.g.:

For uploading, usually you can find the appropriate input element and send keys to it with a path to the file:

Let me know if your case cannot be solved by using the answers in the links I've attached.


As for your first, "download file automatically" problem, you just need to set a correct content-type:

profile.set_preference('browser.helperApps.neverAsk.saveToDisk', "application/xml,text/xml")

Second problem fix (upload part):

driver.find_element_by_name("input_product_list").send_keys(textpath)
driver.find_element_by_name('include_sr').click()
driver.find_element_by_id('submit').click()

Upvotes: 5

Related Questions