In today’s world, it is silly and naive to think of a webpage not implementing JavaScript. Even the smallest of webpage will be executing a small code of Javascript in it.
One of the most common ways in which JavaScript is present on the web page is in terms of Alerts, Pop-Ups and Confirmation boxes. These are the basic types of JavaScript alerts that most web page incorporate. You must have had encountered these kinds of alert boxes in real life, on the internet. A good example is when you delete all items from a e-commerce application, it always prompts a message asking for confirmation that you really want to delete all the items from the cart. That alert or confirmation box is a type of JavaScript alert that we are talking about here.
A simple example can be found out here. Now JS Alerts and Pop-ups are one of the most annoying things that we need to handle when we are going to test a web page using Selenium. However if you know how to handle it, then it becomes it very easy to handle it.
We’re going to handle three different types of JS Alerts :
- Simple JS Alert
- A Confirmation Box
- A JS Prompt
Let us see how we are going to handle all these three types of Alerts.
Handling JS Alert
A Simple JS Alert looks like this :
In case such a scenario, we need to switch to this alert first and then click on the OK button. For doing this we need to use switch_to.alert
property. Then we will use the accept( )
method to accept the alert or in simple words we will click on the OK button.
__author__ = 'rahul' import unittest from selenium import webdriver class JSAlertCheck(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_JSAlert(self): driver = self.driver driver.maximize_window() driver.get('http://the-internet.herokuapp.com/javascript_alerts?__s=xg1k6kuwg5ks2nkp3wfa&utm_campaign=elemental-selenium-ruby&utm_medium=email&utm_source=51-javascript-alerts') #this searches for for the first alert button and clicks on that btn1=driver.find_elements_by_css_selector('button')[1] btn1.click() #now we switch to alert popup = driver.switch_to.alert #use the accept() method to accept the alert popup.accept() #this gets the result text returned textreturned = driver.find_element_by_id('result') print(textreturned.text) #we assert if the text returned is what we wanted self.assertTrue(textreturned.text,"You Clicked: OK") def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
Now we would see how we are going to handle another kind of JavaScript alert- the Confirmation Alert.
Handling JS Confirmation Alerts
This is what a JS Confirmation Alert looks like
This is handled in the same way as the JS Alert that we handled above. The only difference is that we also have a dismiss( )
method in case we want to cancel the alert.
__author__ = 'rahul' import unittest from selenium import webdriver class JSAlertConfirm(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_JSAlertConfirm(self): driver = self.driver driver.maximize_window() driver.get('http://the-internet.herokuapp.com/javascript_alerts?__s=xg1k6kuwg5ks2nkp3wfa&utm_campaign=elemental-selenium-ruby&utm_medium=email&utm_source=51-javascript-alerts') #get the second button by xpath and click on it btn2 = driver.find_element_by_xpath("//*[@id='content']/div/ul/li[2]/button") btn2.click() #switch to the alert jsalert= driver.switch_to.alert #accept the alert jsalert.accept() #get the resultant text and assert if it is same as we want textReturned = driver.find_element_by_id('result') print(textReturned.text) self.assertTrue(textReturned.text, 'You Clicked: Ok') #refresh the webpage driver.refresh() #get the button again and click on it btn2 = driver.find_element_by_xpath("//*[@id='content']/div/ul/li[2]/button") btn2.click() #switch to alert jsalert = driver.switch_to.alert #to cancel the alert, we need to use dismiss( ) method jsalert.dismiss() #get the resultant text and assert if it is same as we expect. textReturned2 = driver.find_element_by_id('result') print(textReturned2.text) self.assertTrue(textReturned2.text,'You Clicked: Cancel') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
The third type of alert that we’re gonna handle is the JS Prompt.
Handling JS Prompt Box
This is what a JS Prompt box looks like
JS Prompt allows to allow some text to be entered in the alert. This is also same as the other two alerts, the only other exception being that if you want so custom text to enter in the prompt, you need to switch to the alert and then use the send_keys( )
method to send the required text. Let us see how we do that.
__author__ = 'rahul' import unittest from selenium import webdriver class JSPrompt(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_JSPrompt(self): driver = self.driver driver.maximize_window() driver.get('http://the-internet.herokuapp.com/javascript_alerts?__s=xg1k6kuwg5ks2nkp3wfa&utm_campaign=elemental-selenium-ruby&utm_medium=email&utm_source=51-javascript-alerts') #get the third button by using it's xpath and click on it btn3 = driver.find_element_by_xpath("//*[@id='content']/div/ul/li[3]/button") btn3.click() #switch to the alert jsprompt= driver.switch_to.alert #send custom text to the prompt using send_keys( ) method jsprompt.send_keys('Rahul') #accept the alert jsprompt.accept() #assert that the result returned is what we expected textReturned = driver.find_element_by_id('result') print(textReturned.text) self.assertTrue(textReturned.text,'You entered: Rahul') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
So these are the three main types of alerts that we need to handle while working with web pages. Now we have another type of alert, which are window-based JS alerts- an example is when you try to attach something to your gmail, then a window based pop-up opens up. We can handle that too, but that can be handled using different methods, which we will try to work out later.
In the next section, we will learn about another wonderful JS mechanism that we use in Selenium- the JavaScriptExecutor
.
Thank you very much for these solutions! Your help in this article was very timely! Thank you a lot!
LikeLike
Glad it helped.
LikeLike
Question: for ‘Handling the JS Prompt Box’solution, you are using: jsprompt.send_keys(‘Rahul’)
However, despite the test completing successfully, it doesn’t appear that ‘Rahul’ is actually being sent. If you add a sleep before the alert accept, you’ll see no entry being made.
Is this the expected result?
Tks!
LikeLike