Open In App

How to Handle Self-Signed Certificate Pop-up in Selenium using Java?

Last Updated : 08 Apr, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

While automating UI test cases we would have come across various challenges in our careers. Handling self-signed pop-ups is one of them. It’s a little bit tricky to handle such a pop-up as it’s not part of the browser, rather it’s a window pop-up. As we know, Selenium is not able to handle windows pop-ups directly. In this article, we will discuss how to handle such pop-ups using Selenium. Just to let the readers know, here is a sample self-signed pop-up we are discussing. 

 

Let’s first understand the problems to handle such pop-ups using Selenium, here are a few reasons listed:

  • As mentioned earlier, it’s not part of the browser, rather it’s a window pop-up and Selenium is not able to interact with the window pop-up. 
  • In Selenium we can use driver.get(“URL”) to load an URL. But the websites that require a self-signed certificate to launch will not be launched using driver.get(“URL”) until the “OK” button is clicked on the pop-up as shown in the picture. If we don’t click on the “OK” button, Selenium will wait for the URL to be loaded and throw an exception after the page timeout period. 
  • As because the code execution will stuck in the driver.get(“URL”) until the page loads, we can’t use any Robot class in the next line to click on the “OK” button. 
  • If we think we can wrap the driver.get(“URL”) inside a try-catch block and once the exception occurs from the driver.get(“URL”) code we can catch it and click on the “OK” button using Robot class, then you are wrong. Because of one driver.get(“URL”) throws an exception, Selenium stops loading the URL, hence even though you click on the “OK” button using Robot class, the page will remain as is. 

Now that we know the problem, let’s discuss the solution. The solution is very interesting and tricky. 

  • First, we need to create two Java Threads.
  • In one of the Threads, we need to write the code driver.get(“URL”).
  • In another Thread, we need to write the code to click on the “OK” button using the Robot class. 
  • Now we need to run these threads in parallel. 

So, what are we trying to achieve here? As discussed in the problem section, we can’t use the Robot class to click the “OK” button unless the driver.get(“URL”) is completely executed. The solution is we will have two separate java threads run in parallel, one will execute the driver.get(“URL”) and wait until the page timeout period, whereas in parallel another thread will click on the “OK” button using the Robot class. This way we can solve the problem. Here is how it works.

Java




import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.event.KeyEvent;
  
public class HandleSelfSignedCertificateError {
  
    WebDriver driver;
  
    public void openBrowser()
    {
        System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "\\src\\test\\resources\\drivers\\chromedriver\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        // Start two threads
        try {
            // start t1 thread that tries to open the URL
            t1.start();
  
            // start t2 thread that click on
            // the Enter button using Robot class
            t2.start();
  
            // Using below 2 lines we
            // run both the thread in parallel
            t1.join();
            t2.join();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run()
        {
            driver.get("https:// google.com");
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run()
        {
            try {
                // Use a sleep of 5 secs for
                // the self signed pop up tp appear.
                Thread.sleep(5000);
                Robot robot = new Robot();
                // Click on Enter button using Robot class
                // Clicking on Enter button because the assumption
                // is the focus would be on "OK" button
                // If the focus is no on "OK" button we can code
                // to click on TAB and move the focus on "OK"
                // button and click on Enter button using Robot class
                robot.keyPress(KeyEvent.VK_ENTER);
            }
            catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            catch (AWTException e) {
                throw new RuntimeException(e);
            }
        }
    });
}


In the above code:

  • First, we have written code to open the Chrome Browser.
  • Next, we created 2 threads t1 and t2.
  • T1 thread is used to load the URL.
  • T2 thread is used to click on the Enter button using the Robot class.
  • Run both threads in parallel.

Note: It’s assumed that when the self-signed pop-up appears, the focus would be on the “OK” button and that’s why we are clicking on the ENTER button using the Robot class. But sometimes the focus may be somewhere else, in such cases, we can press the TAB key using the Robot class to move the focus to the “OK” button and then press on ENTER button to click on the “OK” button.

Using the above approach, we should be able to handle this tricky situation in Selenium.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads