Selenium XPath无法点击IMDB电影评分按钮问题求助
IMDB电影评分按钮点击失败(Selenium)
尝试为IMDB电影《Mona Lisa and the Blood Moon》设置评分,第一步点击评分入口按钮正常,但点击1星按钮时触发超时异常。
当前Python代码(已省略登录步骤)
driver.get('https://www.imdb.com/title/tt8760670/?ref_=nv_sr_srsg_0') wait = WebDriverWait(driver, 20) xpath = "(//div[@data-testid='hero-rating-bar__user-rating'])[1]//button" wait.until(EC.element_to_be_clickable((By.XPATH, xpath))).click() xpath = "//button[@aria-label='Rate 1']//svg" wait.until(EC.element_to_be_clickable((By.XPATH, xpath))).click()
目标元素HTML结构
<div class="ipc-starbar"> <div class="ipc-starbar__touch"></div> <div class="ipc-starbar__rating"> <button class="ipc-starbar__rating__button" role="button" aria-label="Rate 1" tabindex="0"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" class="ipc-icon ipc-icon--star ipc-starbar__star ipc-starbar__star--active" id="iconContext-star" viewBox="0 0 24 24" fill="currentColor" role="presentation"> <path d="M12 17.27l4.15 2.51c.76.46 1.69-.22 1.49-1.08l-1.1-4.72 3.67-3.18c.67-.58.31-1.68-.57-1.75l-4.83-.41-1.89-4.46c-.34-.81-1.5-.81-1.84 0L9.19 8.63l-4.83.41c-.88.07-1.24 1.17-.57 1.75l3.67 3.18-1.1 4.72c-.2.86.73 1.54 1.49 1.08l4.15-2.5z"></path> </svg> </button>
报错信息
File "C:\Users\user\PycharmProjects\SeleniumProject1\Main\Show_Change.py", line 78, in
wait.until(EC.element_to_be_clickable((By.XPATH, xpath))).click()
File "C:\Users\user\PycharmProjects\SeleniumProject1\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 90, in until
raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
Backtrace:
环境信息
- PyCharm 2022.2.2 Build #PC-222.4167.33
- Python 3.10.7
- chromedriver win32 105.0.5195.52
解决方案
1. 修正元素定位路径
原代码定位到svg子元素,但实际可交互的点击目标是父级button,直接定位button更稳定:
# 替换第二段的xpath xpath = "//button[@aria-label='Rate 1']" wait.until(EC.element_to_be_clickable((By.XPATH, xpath))).click()
2. 处理遮挡/可视区域问题
若评分按钮位于弹窗内,可能因元素未完全进入可视区域导致点击失败,可先滚动到元素位置再点击:
from selenium.webdriver.common.action_chains import ActionChains rate_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Rate 1']"))) # 滚动到元素可见 driver.execute_script("arguments[0].scrollIntoView();", rate_btn) # 用ActionChains执行点击 ActionChains(driver).move_to_element(rate_btn).click().perform()
3. 等待评分弹窗完全加载
先等待评分弹窗的容器元素加载完成,再定位按钮:
# 等待评分弹窗容器出现 wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ipc-starbar"))) # 定位并点击1星按钮 rate_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Rate 1']"))) rate_btn.click()
内容的提问来源于stack exchange,提问作者Cyrus
相关产品推荐
相关产品推荐

