You've probably heard of Selenium WebDriver, the widely popular browser automation library right? Did you know that you can validate the HTML Geolocation API feature using Selenium WebDriver? If not, keep reading and you'll soon find out how!
Figure 1: Geolocation API asking for permissions
Setup
For this short tutorial we'll be using the following example Java application hosted on GitHub: Java Selenium Examples
Start by cloning the project and opening it up in Eclipse or Intellij IDEA. I'll be using Eclipse for this tutorial.
Note: If you want to follow along with a different Java application feel free to do so.
Setting up environmental variables
If you're using Eclipse, make sure to following these steps so that the paths to your local installations of geekodriver
and firefox.bin
are set:
- Navigate to the Run Configurations page via
Run
->Run Configurations
- Select the
JUnit
configuration that you plan to use in running the tests - Navigate to the
Environment
tab - Click on
Add
and enter the following key/value pairs:-
FIREFOX_PATH
: Your local path to yourfirefox
executable file. For example it should look like the following if you're using Windows:C:\\Program Files\\Mozilla Firefox\\firefox.exe
-
GEEKODRIVER_PATH
: Your local path to yourgeckodriver
executable file. Here's what a Windows path should look like:C:\\..\\geckodriver\\geckodriver.exe
-
- Click
Apply
to save changes
Testing
Let's navigate to the src.com.codinginformer.test.SeleniumGeolocation
class and go through its methods, starting with the @Before
method:
@Before
public void initFirefox() {
Properties properties = new Properties();
System.setProperty("webdriver.gecko.driver", System.getenv("GEEKODRIVER_PATH"));
System.setProperty("webdriver.firefox.bin", System.getenv("FIREFOX_PATH"));
WebDriver driver = new FirefoxDriver();
}
The above method establishes properties for geckodriver
. It needs the local geckodriver
executable file path set to the webdriver.gecko.driver
property along with the firefox
executable file set to wherever your local firefox
executable file resides
Finally, we instantiate the FirefoxDriver()
class to the driver
variable
Next, let's cover the checkGeolocation()
method:
@Test
public void checkGeolocation() {
String baseUrl = "https://selenium-testing-website.herokuapp.com/geolocation";
FirefoxProfile geoDisabled = new FirefoxProfile();
geoDisabled.setPreference("geo.enabled", true);
geoDisabled.setPreference("geo.provider.use_corelocation", true);
geoDisabled.setPreference("geo.prompt.testing", true);
geoDisabled.setPreference("geo.prompt.testing.allow", true);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(FirefoxDriver.PROFILE, geoDisabled);
@SuppressWarnings("deprecation")
WebDriver driver = new FirefoxDriver(capabilities);
driver.get(baseUrl);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
driver.findElement(By.id("get-geolocation")).click();
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
Assert.assertNotNull(driver.findElement(By.id("lat-value")).getText());
Assert.assertNotNull(driver.findElement(By.id("long-value")).getText());
}
Here is an explanation for the above test:
-
FirefoxProfile geoDisabled = new FirefoxProfile();
: TheFirefoxProfile
class is a collection of settings, customizations, add-ons and other personalization settings that can be done on the Firefox browser. For our purposes of testing the HTML Geolocation API we need to enabled the following settings:geo.enabled
geo.provider.use_corelocation
geo.prompt.testing
geo.prompt.testing.allow
Then we have to add the
FirefoxProfile
instance to aDesiredCapabilities
class instance, which is a class used to set properties of browsers in order to conduct web application testing(more onDesiredCapabilities
in this great blog post)As the
new FirefoxDriver(capabilities)
expression is now deprecated, we can add a@SuppressWarnings("deprecation")
decorator in order to silence that warningdriver.get(baseUrl);
: Theget()
method is used to launch a new browser session to the URL specified. This URL is specifically picked out because it contains a Geolocation section that prompts the user with a confirmation modal for tracking the user's locationdriver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS)
: The firstimplicitlyWait()
method we use is for the purposes of indicating the Selenium WebDriver to wait for 2 seconds before continuing execution. This is done in order to allow ample time for the page to loaddriver.findElement(By.id("get-geolocation")).click();
: Here we are identifying the Geolocation button by using theBy.id()
method. Afterwards, we click the button via the methodclick()
Assert.assertNotNull(driver.findElement(By.id("lat-value")).getText());
: After waiting for 2 seconds, we useBy.id
to identify two<p>
elements that contains the longitude and latitude values of the user's current location
Now just right click on the SeleniumGeolocation.java
file and select Run As -> JUnit Test
in order to run our test.
Figure 2: Intial Page
Figure 3: Geolocation coordinates shown
Figure 4: Our JUnit test is passing
And with that, we're able to validate the Geolocation API using by Selenium WebDriver!
Congrats if you managed to get this functionality working. If not, leave a comment in the comments section and I'll get back to you if I find the time.
Conclusion
Thanks for reading this blog post!
If you have any questions or concerns please feel free to post a comment in this post and I will get back to you when I find the time.
If you found this article helpful please share it and make sure to follow me on Twitter and GitHub, connect with me on LinkedIn and subscribe to my YouTube channel.
Top comments (0)