Some time ago I had to test a web app where a popup was triggered if the user hovers over a specific link. This is not as easy as testing if an element contains a specific text. But it’s possible using Selenium Actions. These class provides methods to perform some custom gestures on a page, like moving to an element. Here is an example how to do this:
// In the following a selector is something like By.id("identifier") // use the Actions class from Selenium to perform custom "mouse" actions Actions builder = new Actions(driver); // move "mouse" to popup link which will open the popup and // then move to the popup in order to avoid automatic closing of it builder.moveToElement(driver.findElement(POPUP_LINK_SELECTOR)) .moveToElement(driver.findElement(POPUP_SELECTOR)) .build() .perform();
In this example Selenium is initiating a move to a popup link which triggers a popup to open. Then it moves to the popup in case it is closing automatically. It’s as simple as that! But it can be a little bit more complicated if the popup won’t open directly, i.e. if it waits a few miliseconds to open – for whatever the reason is. Then you have to wait for it in your test. For this use case you can use a WebDriverWait combined with ExpectedConditions to wait for an element to be visible:
// Again: a selector is something like By.id("identifier") // move "mouse" to the popup link which will open the popup builder.moveToElement(driver.findElement(POPUP_LINK_SELECTOR) .build() .perform(); // wait 1 second for popup to be open and make sure it is visible WebElement popup = new WebDriverWait(driver, 1).until(ExpectedConditions.visibilityOfElementLocated(POPUP_SELECTOR)); assertTrue("popup should be visible", popup.isDisplayed()); // move "mouse" to popup in order to avoid that it's closing automatically builder.moveToElement(driver.findElement(POPUP_SELECTOR)) .build() .perform();
Personally I prefer the second version, because in the first one you can’t always be sure that Selenium is fast enough (or maybe even too fast) to find the popup. Thus it’s a good idea to use a waiter.
If you want to try it out, you can find an example project here: https://github.com/seeebiii/SeleniumHoverExample