Search code examples
javaseleniumselenium-webdrivermousehoverwebdriverwait

How to Mouse Hover over different images with dynamic xpaths through Selenium Java


There are seven images. I want to do mouse hover on every image and and check AddToCart button is displayed or not. I have tried following code and it is not working.

Reference: http://automationpractice.com/index.php

public boolean checkMouseHoveronAllItems(WebDriver driver)
{
    String xpathOfItems="//[@id='homefeatured']/li['+index+']/div/div[1]/div/a[1]/img";                                                                        
    String xpathOfAddToCartButtons="//div[@class='button-container']/a[@title='Add to cart']";
    boolean res=false;
    for(int index=1;index<=countNoOfItems(driver);index++)
    {
        element=driver.findElement(By.xpath(xpathOfItems));
        performMouseHover(element);
        System.out.println("Item By index"+element.getAttribute("alt"));
        element=element.findElement(By.xpath(xpathOfAddToCartButtons));
        if(element.isDisplayed())
        {
            res=true;               
            Log.info("Element is available");
        }
        else 
        {
            res=false;
        }
    }
    return res;
}

Code always taking the fist element and printing the alt attribute text.


Solution

  • To Mouse Hover over all the seven (7) images and check if the element with text as AddToCart is displayed or not you can use the following solution:

    driver.get("http://automationpractice.com/index.php");
    ((JavascriptExecutor) driver).executeScript("return arguments[0].scrollIntoView(true);", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[@class='homefeatured']"))));
    List<WebElement> myProducts = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//ul[@id='homefeatured']//div[@class='product-image-container']/a/img")));
    for(WebElement product:myProducts)
    {
        new Actions(driver).moveToElement(product).build().perform();
    
        if(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//ul[@id='homefeatured']//div[@class='product-image-container']/a/img//following::a[@title='Add to cart']/span"))).isDisplayed())
            System.out.println("AddToCart button is displayed");
        else{
            System.out.println("AddToCart button is not displayed");
        }
    }