You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Selenium定位并点击Pearson网站的Biology(2018)元素?

Selenium定位Pearson网站元素问题解决方案

问题描述

我在Pearson网站上尝试用Python Selenium定位并点击目标HTML元素时遇到困难。操作流程是:滚动页面后按下B键选择Biology,弹出的菜单里“Biology (2018)”和“Biology”是目标元素,其中“Biology (2018)”的HTML代码如下:

<li data-ng-repeat="modalSubject in subject.subjectsList | orderBy:'-title'" class="ng-scope">  
  <a tabindex="0" data-ng-keypress="handleKeyPress($event)" data-ng-click="setExamSeriesUrl(modalSubject);">
    <h3 class="ng-binding">Biology (2018)</h3>
    <div class="description ng-binding"></div>
  </a>
</li>

我尝试了以下代码,但即使加了time.sleep()等待元素加载,还是出现超时错误,无法定位并点击该元素:

xpath = '//li[contains(.//h3, "{}")]'
formatted_xpath = xpath.format(Subject+" (2018)")
element = wait.until(EC.visibility_of_element_located((By.XPATH, formatted_xpath)))
element.click()

请问该如何定位并点击这个元素?

解决方案

1. 排查iframe影响

很多网站的弹窗内容会嵌入在iframe中,若未切换到对应iframe,Selenium无法定位元素。可以遍历iframe尝试切换:

# 遍历所有iframe,尝试切换并定位元素
for iframe in driver.find_elements(By.TAG_NAME, "iframe"):
    driver.switch_to.frame(iframe)
    try:
        element = wait.until(EC.visibility_of_element_located((By.XPATH, formatted_xpath)))
        break
    except:
        driver.switch_to.default_content()

如果找到目标元素,后续操作保持在该iframe内;若未找到,切回默认页面上下文继续。

2. 优化定位表达式

原XPATH不够精准,试试以下几种更可靠的定位方式:

  • 精准匹配文本并定位可点击标签:
    直接定位触发点击的<a>标签,同时使用element_to_be_clickable确保元素可交互:
formatted_xpath = f'//h3[text()="Biology (2018)"]/parent::a'
element = wait.until(EC.element_to_be_clickable((By.XPATH, formatted_xpath)))
element.click()
  • 结合Angular属性定位:
    利用页面的Angular属性data-ng-click缩小定位范围:
formatted_xpath = f'//a[@data-ng-click="setExamSeriesUrl(modalSubject);"]//h3[text()="Biology (2018)"]/parent::a'
element = wait.until(EC.element_to_be_clickable((By.XPATH, formatted_xpath)))
element.click()

3. 处理弹窗加载与点击遮挡

确保弹窗完全加载后再定位元素,若元素被遮挡,用JavaScript执行点击:

# 先等待弹窗容器加载完成
wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "ng-scope")))
# 定位目标元素
formatted_xpath = f'//h3[text()="Biology (2018)"]/parent::a'
element = wait.until(EC.element_to_be_clickable((By.XPATH, formatted_xpath)))
# 用JS点击绕过遮挡问题
driver.execute_script("arguments[0].click();", element)

4. 验证变量取值

确认Subject变量的值为"Biology",避免格式化后的XPATH文本错误。可以打印生成的XPATH检查:

print(formatted_xpath)

内容的提问来源于stack exchange,提问作者axve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:15:32