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

Python中Selenium无法定位data-test-id为content-container的元素如何解决?

问题原因与解决方案

触发异常的核心原因

  • 页面未等待加载完成就执行元素查找:调用driver.get()跳转到文章页后,直接同步执行find_element,此时页面DOM还未完成渲染,目标容器还没生成,自然找不到元素。
  • 未验证登录状态有效性:点击登录按钮后没有校验是否真的登录成功,若触发人机验证、账号密码错误等情况,实际仍处于未登录状态,访问文章页会被重定向到权限页/登录页,不存在目标容器。
  • 无头模式触发反爬策略:部分网站会识别无头浏览器特征,即使添加了disable-blink-features=AutomationControlled参数,仍可能返回和普通浏览器不一样的页面结构,没有目标元素。
  • 代码写法存在兼容性问题:使用的find_element_by_xpath是Selenium 3的废弃写法,Selenium 4+版本已移除该API,也可能导致元素查找失败;另外把单个元素对象直接遍历也会触发后续报错。

修复方案

调整后的可运行代码如下:

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

CHROMEDRIVER_PATH = './chromedriver'

chrome_options = Options()
chrome_options.add_argument("--headless=new") # 改用新版无头模式,兼容性更好
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") # 手动指定UA,避免无头模式默认UA被反爬识别

LOGIN_PAGE = "https://www.seekingalpha.com/login"
ACCOUNT = "你的实际账号"
PASSWORD = "你的实际密码"

driver = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=chrome_options) # 适配新规范,将chrome_options参数改为options
wait = WebDriverWait(driver, 30)
driver.get("https://www.seekingalpha.com/login")
wait.until(EC.element_to_be_clickable((By.NAME, "email"))).send_keys(ACCOUNT)
wait.until(EC.element_to_be_clickable((By.ID, "signInPasswordField"))).send_keys(PASSWORD)
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='Sign in']"))).click()

# 新增:等待登录完成、页面跳转后再执行后续操作
wait.until(EC.url_changes(LOGIN_PAGE))

driver.get("https://seekingalpha.com/article/4414043-agenus-inc-agen-ceo-garo-armen-on-q4-2020-results-earnings-call-transcript")
# 新增:显式等待目标容器加载完成,避免提前查找
text_element = wait.until(EC.presence_of_element_located((By.XPATH, "//*[@data-test-id='content-container']")))

# 修正:查找容器下所有p标签再遍历输出
p_list = text_element.find_elements(By.TAG_NAME, 'p')
for t in p_list:
    print(t.text)

如果调整后仍出现找不到元素的问题,可在跳转到文章页后添加print(driver.page_source)打印当前页面源码,排查是否真的返回了包含目标容器的页面;也可临时关闭无头模式,直观查看页面加载状态,确认是否触发了人机验证或权限拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 19:54:04