Python Selenium 从WebElement列表按class定位子元素报错问题咨询
问题根因
- 你使用的
find_element_by_class_name属于Selenium 3的废弃API,在Selenium 4版本中父元素上下文调用该API时,会出现相对路径解析异常,没有在当前title元素的子节点范围内查找,导致定位失败。 - 现有代码还存在类型错误:
print("Also: " + heading2)直接拼接WebElement对象和字符串,会抛出类型错误,需要取元素的.text属性输出。
解决方案
方案1:改用Selenium 4标准定位写法(最推荐)
替换所有旧的find_element_by_*API为官方推荐的find_element(By.定位类型, 定位值)写法,修复后完整代码如下:
from typing import List, Text from selenium import webdriver from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.common.by import By driver = webdriver.Chrome() url = 'C:\\Users\\ed821\\Downloads\\TEST2.html' driver.get(url) titles = driver.find_elements(By.CLASS_NAME, "pp") for title in titles: heading = title.find_element(By.TAG_NAME, "h1") heading2 = title.find_element(By.CLASS_NAME, "a1") print("Title is:" + heading.text) print("Also: " + heading2.text)
方案2:CSS选择器相对定位(兼容性最强)
如果方案1仍有异常,可以直接使用CSS选择器明确限定在当前父元素下查找:
# 写法1:查找当前元素下所有class为a1的子节点 heading2 = title.find_element(By.CSS_SELECTOR, ".a1") # 写法2:仅查找当前元素的直接子节点中class为a1的元素,匹配度更高 heading2 = title.find_element(By.CSS_SELECTOR, "> .a1")
Selenium 3临时兼容方案
如果你仍在使用Selenium 3版本,可以改用相对Xpath定位,注意开头的.不能省略,代表从当前元素上下文开始查找:
heading2 = title.find_element_by_xpath(".//*[@class='a1']")
内容的提问来源于stack exchange,提问作者Ed Landau
相关产品推荐
相关产品推荐

