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

如何用CSS选择器定位第一个el-table?Selenium定位失败求助

问题定位失败原因及解决方案

核心问题分析

  • Vue的v-if是条件渲染指令,当条件满足时元素才会被渲染到DOM中,渲染完成后该v-if属性不会保留在最终的HTML结构里,所以你用div.el-table-box[v-if="!specialAnnounce"]这类依赖v-if属性的选择器根本无法找到目标元素。
  • 你的代码中混合了直接查找和显式等待逻辑,且显式等待使用的选择器div.el-table-box[v-if$='!specialAnnounce']同样因上述原因无效,导致超时异常。

可行解决方案

方案一:利用元素结构位置区分

第一个el-table-box是顶级div(未被嵌套在v-if="specialAnnounce"的容器内),第二个则被包裹在div[v-if="specialAnnounce"]中,可通过结构选择器定位:

# 定位第一个el-table-box下的el-table
first_table = wait.until(EC.visibility_of_element_located(
    (By.CSS_SELECTOR, "div.el-table-box:not(div[v-if='specialAnnounce'] > div.el-table-box) el-table")
))

若页面中只有这两个el-table-box,也可直接用:first-of-type简化选择器:

first_table = wait.until(EC.visibility_of_element_located(
    (By.CSS_SELECTOR, "div.el-table-box:first-of-type el-table")
))

方案二:通过元素内部特征定位

第一个表格包含secCode(代码)列,第二个表格没有该列,可通过此特征区分:

# 通过包含代码列的特征定位第一个表格
first_table = wait.until(EC.visibility_of_element_located(
    (By.CSS_SELECTOR, "el-table:has(el-table-column[prop='secCode'])")
))

注意::has()选择器要求Chrome浏览器版本101及以上。

方案三:优化页面加载等待与浏览器配置

  • 无头模式下需设置窗口大小,否则部分元素可能因视口问题不渲染;同时可适当延长等待时间:
chrome_options.add_argument("--window-size=1920,1080")  # 添加窗口大小配置
wait = WebDriverWait(driver, 15)  # 延长等待时间至15秒

完整修正代码示例

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

# 配置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920,1080")  # 新增窗口大小配置

chromedriver_path = '/path/to/chromedriver'
driver = webdriver.Chrome(executable_path=chromedriver_path, options=chrome_options)

url = "http://www.cninfo.com.cn/new/commonUrl/pageOfSearch?url=disclosure/list/search" 
driver.get(url)

# 等待第一个表格加载完成
wait = WebDriverWait(driver, 15)
first_table = wait.until(EC.visibility_of_element_located(
    (By.CSS_SELECTOR, "div.el-table-box:first-of-type el-table")
))

# 执行后续操作...

driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:12:00