Susannah Potts
Susannah Potts

Reputation: 827

Selenium Driver (Chrome) Can't Find Dropdown on hover Element

I'm using the Selenium Chrome Driver to run a couple tests on various site environments, however, when attempting to use an element from a hover drop down menu, I can't seem to reliably select the elements. This works 100% of the time when I'm debugging, but when I run it without an attached debugger it fails about 2/3rds of the time. Here is the code:

private void prepWindow(WebDriver driver, boolean isNightly, String toClick) {
    WebDriverWait wait = new WebDriverWait(driver, 300);

    try {
        if (isNightly) {
            WebElement nightlyPopup = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(BOWebElements.nightlyPopup)));
            nightlyPopup.click();
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Nightly popup has changed names again.", "Error", JOptionPane.ERROR_MESSAGE);
    }

    WebElement user = wait.until(ExpectedConditions.visibilityOfElementLocated(By.linkText("Users")));
    Actions action = new Actions(driver); 

    action.moveToElement(user).build().perform(); //Makes hover drop down appear
    driver.findElement(By.id(toClick)).click(); //Should click element that is only visible when hover drop down is open
}

I should also note that the same code above works perfectly without using a debugger on a coworker's computer, but not my own.

I would like to use XPath but unfortunately the elements of the drop down aren't actually children of the link I have to hover over to open the drop down. If I try to navigate directly to the element using the XPath, it gives me an error saying the XPath isn't valid. Here is one of the potential XPaths:

//html/body/#outTemplateId/#preambleFormId/#globalNavigation/#navBGC/#navBGCmainMM/ul/li/ul/table/tbody/tr/td/ul.ui-menu-list.ui-helper-reset/li.ui-menuitem.ui-widget.ui-corner-all/a#fleetUsersId2.ui-menuitem-link.ui-corner-all.submenu

How can I make the behavior consistent?

Upvotes: 0

Views: 1268

Answers (1)

Pseudo Sudo
Pseudo Sudo

Reputation: 1412

Chain your actions together to better emulate the actions that a user would take:

action.moveToElement(user).moveToElement(driver.findElement(By.id(toClick))).click().build().perform();

Check out this question for more details: https://stackoverflow.com/a/17294390/3537915

Upvotes: 1

Related Questions