A lot of times we are faced with situations, where clicking a link or a button opens up an entire new browser window, and we have multiple instances of windows opening up.
Let’s see a quick example here :
Browse over to this link, and click the hyperlink that says “Open a popup Window“. A little browser window opens up when we click this hyperlink.
These are multiple windows, and most often than not, they are present in a majority of webpages. If we want to perform some functions in the child window (the one which comes after we click the link), then we need to switch over the control to the child windows and then perform that said operation, because by default, the focus is on the parent window.
Selenium API has provided us in-built methods, so that we can reset or transfer the focus from the parent to child windows and then perform what we wanna do.
Let us see how these situations can be handled using Selenium.
import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By class GoogleOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_google_search_page(self): driver = self.driver driver.get("http://www.quackit.com/html/codes/html_popup_window_code.cfm") str1=driver.title print(str1) #get the window handles using window_handles( ) method window_before = driver.window_handles[0] print(window_before) #since the pop-up is now in an iframe driver.switch_to.frame(driver.find_element_by_name('result1')) driver.find_element_by_link_text('Open a popup window').click() #get the window handle after a new window has opened window_after = driver.window_handles[1] #switch on to new child window driver.switch_to.window(window_after) str2=driver.title print(str2) print(window_after) #assert that main window and child window title don't match self.assertNotEqual(str1,str2) print('This window has a different title') #switch back to original window driver.switch_to.window(window_before) #assert that the title now match self.assertEqual(str1,driver.title) print('Returned to parent window. Title now match') def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main()
The output should be, the windows name should be printed and title should be asserted as well. Once you run the script, we have this output in PyCharm :
Now let us understand how we managed to do it . The window_handles( )
method provides a way to return all windows in a current session.
We used the switch_to.window( )
method to switch over the control to newly opened window. Here we can pass the following two parameters- either the windows name or
Now here we have assumed that we already know that we have two windows open. What if, there are more than two child windows open. How would you switch the control over to the third or more open windows? I have discussed this more in detail here.
Thank you!
LikeLike
This will not work.
It complains about locating by_link_text.
Don’t confuse reader s and make sure when you write blogs, you are placing an executable program.
With due respect, I advice you ,please run the test and if and only if it works, otherwise do not confuse readers.
Thanks,
Jay
LikeLike
A short while before, the page changed the HTML and placed the pop up link in an iframe. That is why you are not getting the desired results. I have updated the code, since the page structure before didn’t have had any iframe in it.
When placing code blocks in my blog, I always make sure that the code block that I am putting is executable. The code that I have put here in my blog are all code, run and then put it in here.
Instead of just blaming something or cursing the blog writer, may be it would have been beneficial for you to know the root cause of the issue. But wait, you aren’t that type. You would just go about whining about every other single thing.
I have this executed right now on the system and I have the same output, as I was having before.
LikeLiked by 1 person
Hi I am getting this error …I am unable to switch to the new window
52 # switch windows
—> 53 driver.switch_to_window(driver.window_handles[1])
54
55 # wait to make sure the new window is loaded
IndexError: list index out of range
Any help will be highly appreciated.
LikeLike
Sumit, this error means that the index 1 that you’re jumping to is not available by the time the switch command is executed. It may be due to the delay in opening a window. A good idea would be to get the count of the windows before jumping into the windows. Let me know if you want me to help out.
LikeLike
Thanks a lot,
The content really helped me to understand the logic as well as my needed automation running as intended.
BR//
LikeLike
Glad I was able to help Rajesh.
LikeLike
Ur tuto look like only cover a specific case. How do you switch between two instances of browser for example ? what is an iframe ?
LikeLike
You can find what is an iframe and how to handle it using Selenium here – https://seleniumwithjavapython.wordpress.com/selenium-with-python/intermediate-topics/handling-iframes-in-a-webpage/
LikeLike