Skip to content
Advertisement

selenium xpath unable to identify class visually seen in HTML

I am trying to click on the rate button to set the rating for episode one of Atlanta season four on the IMDB website as illustrated by the image further below.

I have tried various combinations of selenium xpath values and have googled various links to attempt to achieve this, but can’t remember which now. My current python is below.

driver.get('https://www.imdb.com/title/tt4288182/episodes/?ref_=tt_ov_epl')

xpath = './/*[@class="list_item odd"]|.//*[@class="list_item even"]'
div = driver.find_element(By.XPATH, xpath)

xpath = './/*[@class="ipl-rating-star ipl-rating-interactive__star--empty"]'
div2 = div.find_element(By.XPATH, xpath)

selector = "spam>svg>path"
class2 = div2.find_element(By.CSS_SELECTOR, selector)

The div variable is assigned as I want with a single element; but the python fails to find the attribute value ‘ipl-rating-star ipl-rating-interactive__star–empty’ , though it can be seen in the html copied from the web page below:

<div class="ipl-rating-star ipl-rating-interactive__star--empty ">
    <span class="ipl-rating-star__star">
        <svg class="ipl-icon ipl-star-border-icon  " xmlns="http://www.w3.org/2000/svg" fill="#000000" height="24" viewBox="0 0 24 24" width="24">
            <path d="M22 9.24l-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03L22 9.24zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28L12 15.4z"></path>
            <path d="M0 0h24v24H0z" fill="none"></path>
        </svg>
    </span>
    <span class="ipl-rating-star__rating">Rate</span>
</div>

The python currently produces this error message: selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:”xpath”,”selector”:”.//*[@class=”ipl-rating-star ipl-rating-interactive__star–empty”]”} (Session info: chrome=105.0.5195.127)

I am also using PyCharm 2022.2.2 Build #PC-222.4167.33 with Python 3.10.7

enter image description here

Advertisement

Answer

You are using wrong locators.
Also you need to add delays to wait for elements to become clickable.
The best practice here is to use WebDriverWait expected conditions explicit waits.
The following code is working.
It actually contains only 2 clicks.
I’m selecting the rating 6 here, but you can select any other value as well.
This can also be done with CSS Selectors instead of XPath.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


options = Options()
options.add_argument("start-maximized")


webdriver_service = Service('C:webdriverschromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
url = "https://www.imdb.com/title/tt4288182/episodes/?ref_=tt_ov_epl"
driver.get(url)
wait = WebDriverWait(driver, 20)

wait.until(EC.element_to_be_clickable((By.XPATH, "//div[contains(@class,'ipl-rating-interactive__star--')]//span[@class='ipl-rating-star__rating']"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, "//a[@href='#void'][@data-value='6']//div[contains(@class,'ipl-rating-interactive__star--')]//span"))).click()

After these to clicks you need to login in order to perform rating enter image description here

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement