Selenium Python如何点击无class、无ID属性的链接元素
Selenium 定位点击无ID/name属性Angular链接的方法
你之前的XPath定位失败核心原因有两个:
- 大小写匹配错误:目标元素内的实际文本是
Hours By Activity,你写的匹配规则里用了小写b开头的by,无法匹配到对应节点 - 点击对象层级错误:就算修正大小写,直接匹配到的是内部的
<span>标签,该标签没有绑定点击事件,点击后无法触发绑定在父级<div>上的ng-click逻辑
可直接使用以下几种方案实现点击:
- 方案1:通过子标签文本定位父级可点击按钮
优先用精准文本匹配,定位到span标签后向上查找绑定了点击事件的div节点,兼容性最好:
如果担心文本前后有不可见空白字符,可以用# Selenium 4+ 版本请使用By类指定定位方式,旧的find_elements_by_xpath接口已被废弃 from selenium.webdriver.common.by import By target = driver.find_element(By.XPATH, "//span[text()='Hours By Activity']/parent::div[@ng-click]") target.click()normalize-space()处理后做模糊匹配,同时加属性校验减少误匹配:target = driver.find_element(By.XPATH, "//span[contains(normalize-space(), 'Hours By Activity')]/ancestor::div[contains(@class, 'btn-primary')]") target.click() - 方案2:通过元素专属属性组合定位
目标div有固定的ng-repeat属性和class特征,可以组合属性直接定位,不用依赖文本层级:target = driver.find_element(By.XPATH, "//div[contains(@class,'btn-primary') and @ng-repeat='dashboard in $ctrl.dashboards track by $index' and contains(.,'Hours By Activity')]") target.click()
如果定位时偶尔出现元素不存在/不可点击的报错,是因为AngularJS动态渲染内容还没加载完成,加显式等待即可解决:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最多等待10秒,直到元素可点击 wait = WebDriverWait(driver, 10) target = wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Hours By Activity']/parent::div[@ng-click]"))) target.click()
内容的提问来源于stack exchange,提问作者bWgibb
相关产品推荐
相关产品推荐

