Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python webdriver to handle pop up browser windows which is not an alert

I am working on a web application, in which clicking on some link another popup windows appears. The pop windows is not an alert but its a form with various fields to be entered by user and click "Next".

How can I handle/automate this popup windows using selenium.

Summary :-

  1. Click on the hyperlink (url) - "CLICK HERE"
  2. A user registration form appears as a pop up
  3. A data is to be filled by user
  4. Click Next/Submit button.
  5. Another next redirected to another page/form 'User Personal Information Page'
  6. Personal information is to be filled by user
  7. Click "Next/Submit"
  8. Popup disappeared.
  9. Now further processing on original/Base page.
like image 821
Ronu Avatar asked Jul 16 '13 12:07

Ronu


People also ask

Can we handle a Windows based pop up in Selenium and if not then what are the alternatives?

Yes, it is possible to handle Windows based pop-ups in Selenium webdriver. Sometimes on clicking a link or a button, another window gets opened. It can be a pop up with information or an advertisement. The methods getWindowHandles and getWindowHandle are used to handle child windows.

How do I ignore popups in Selenium?

You can run override script in the Selnium IDE before click on "Save" (or something like this) button through selenium. runScript - it should simple disable the confirmation window.


1 Answers

Switching to a popup is challenging for at least two separate reasons:

  1. The one that many people know, which is that you need to use driver.switch_to.window(window_handle) both when the popup appears, so that you can find elements in the popup window, and after the popup is closed, so that you can find elements back in the main window.
  2. The one that only people with slow machines are likely to encounter, which is that when Selenium makes a window handle available as a variable, it's initially set to None, and takes a little while before it's filled in with a value.

Here's some code that addresses those issues while carrying out your requested sequence. I'm leaving out the import statements, and I'm using variable names that I hope are obvious. Also, note that I like to use find_element(s)_by_xpath in my code; feel free to use other find_element(s)_by methods:

main_window_handle = None while not main_window_handle:     main_window_handle = driver.current_window_handle driver.find_element_by_xpath(u'//a[text()="click here"]').click() signin_window_handle = None while not signin_window_handle:     for handle in driver.window_handles:         if handle != main_window_handle:             signin_window_handle = handle             break driver.switch_to.window(signin_window_handle) driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1) driver.find_element_by_xpath(u'//input[@value="OK"]').click() driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2) driver.find_element_by_xpath(u'//input[@value="OK"]').click() driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content() 

Please let me know if someone (maybe me) needs to add more to the example, or provide other info, to make it more clear.

like image 86
Lindsay Avatar answered Sep 22 '22 23:09

Lindsay