'Unable to find the xpath of star using selenium & java

Thank you in advance !

url - https://www.tripadvisor.in/UserReviewEdit-g641714-d1156207-Club_Mahindra_Madikeri_Coorg-Madikeri_Kodagu_Coorg_Karnataka.html

i need to hover on the stars and select the 5th star.

please find my code :-

private static void setRating(String star) {
        //new Actions(driver).moveToElement(driver.findElement(By.xpath("//*[@id='qid10']/option[1]"))).perform();
        List<WebElement> rating = driver.findElements(By.xpath("//span[@class='ui_bubble_rating fl bubble_00']"));
        rating.size();

        List<WebElement> ele = driver.findElements(By.xpath("//div[@class='easyClear bigRatingParent']"));
        System.out.println(ele.size());
        for(WebElement ratings:ele) {
            System.out.println(ratings);
        }
        new Actions(driver).moveToElement(driver.findElement(By.xpath("//div[@class='question rating bigRating labelAndInput required  ']/child::label/following-sibling::div/child::span"))).perform();
        driver.findElement(By.xpath("//*[@id='qid10']/option[6]")).click();

    }
}


Solution 1:[1]

Try using Java script executor

JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("document.getElementById('bubble_rating').ui_bubble_rating fl bubble_05 bubble_50");

this would work, please kindly let me know

Solution 2:[2]

To select the 5th star within https://www.tripadvisor.in/ you have to induce WebDriverWait for the visibilityOfElementLocated() and you can use either of the following Locator Strategies:

  • xpath:

    driver.get("https://www.tripadvisor.in/UserReviewEdit-g641714-d1156207-Club_Mahindra_Madikeri_Coorg-Madikeri_Kodagu_Coorg_Karnataka.html]");
    new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='bubble_rating']"))), 50, 0).click().build().perform();
    
  • cssSelector:

    driver.get("https://www.tripadvisor.in/UserReviewEdit-g641714-d1156207-Club_Mahindra_Madikeri_Coorg-Madikeri_Kodagu_Coorg_Karnataka.html]");
    new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span#bubble_rating"))), 50, 0).click().build().perform();
    
  • Browser Snapshot:

bubble_rating_widget

Solution 3:[3]

I think hover will not work as it is single element for whole rating bar. so what i have observed it will changed class value for selected rating. We can do change rating with change class attribute's valuewith JS

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('bubble_rating').setAttribute('class', 'ui_bubble_rating fl bubble_50')");

OR

WebElement element = driver.findElement(By.id("bubble_rating"));

    js.executeScript("arguments[0].setAttribute('class','ui_bubble_rating fl bubble_50')", element);

it will do the job.

Solution 4:[4]

Try this:

import java.time.Duration;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class TripAdvisor 
{
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        
        System.setProperty("webdriver.chrome.driver","C:\\selenium\\Drivers\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String baseUrl = "https://www.tripadvisor.in/"
                        + "UserReviewEdit-g641714-d1156207-Club_Mahindra_Madikeri_Coorg-Madikeri_Kodagu_Coorg_Karnataka.html";
        driver.get(baseUrl);
        
        // Capture the webElement and its width
        WebElement target = driver.findElement(By.xpath("//img[@alt='Roll over, then click to rate']/.."));
        Dimension dimension = target.getSize();
        int  width= dimension.getWidth();
        
        // Initialize the list of 5 star rating with no elements
        List<WebElement> rating5star= driver.findElements(By.xpath("//span[@class='ui_bubble_rating fl bubble_50']"));
        
        
        // When using the W3C Action commands, offsets are from the center of element
        // This is in contradiction to the information provided in Selenium java docs
        // https://selenium.dev/selenium/docs/api/java/org/openqa/selenium/interactions/Actions.html#moveToElement-org.openqa.selenium.WebElement-int-int-
        // Hence the movement should be from -(width/2) to (width/2)
        
        Actions action = new Actions(driver);
        int x = (0 - width/2);
        while(rating5star.size()==0 & x<=(width/2))
        {
            action.moveToElement(target, x, 0).click().pause(Duration.ofSeconds(1)).perform();
            rating5star= driver.findElements(By.xpath("//span[@class='ui_bubble_rating fl bubble_50']"));
            System.out.println(rating5star.size());
            x=x+10;
        }
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 undetected Selenium
Solution 3
Solution 4 Pang