qq_46151004 2024-02-23 14:20 采纳率: 1.8%
浏览 22
已结题

selenium获取非固定位置的元素

如何用selenium获取非固定位置的元素,元素在表格中的位置可能会发生变化,对应的元素地址xpath也会发生变化,如果用By.XPATH引用固定地址寻找元素后,若元素在表格中的位置发生变化时就找不到目标元素了,见下图。
问:以上情况怎么办?

img

  • 写回答

20条回答 默认 最新

  • 关注

    qq_46151004 下午好🌅🌅🌅
    本答案参考通义千问

    要使用Selenium获取非固定位置的表格中动态变化的元素,可以采用以下方法:

    1. 使用CSS_SELECTORXPATH结合动态属性选择器(如.//table[contains(@class,'MOD') and tr[td[@class='MODComp' and .='分析-V1']])来定位具有特定类名且包含指定文本的<tr>元素,而不是硬编码固定的XPath路径。这是因为动态属性(如contains())可以根据实际页面内容的变化而动态匹配。

      CSS_SELECTOR 示例:

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      # 获取动态文本“分析-V1”的父元素(<tr>)
      dynamic_tr_element = WebDriverWait(driver, timeout).until(
          EC.presence_of_element_located((By.CSS_SELECTOR, ".MOD table tr:contains('分析-V1')"))
      )
      

      XPATH 示例:

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      # 获取动态文本“分析-V1”的父元素(<tr>)
      dynamic_tr_element = WebDriverWait(driver, timeout).until(
          EC.presence_of_element_located((By.XPATH, "//table[contains(@class,'MOD')]//tr[td[contains(text(),'分析-V1')]]"))
      )
      
    2. 一旦找到具有特定“分析-V1”文本的<tr>元素,可以通过find_elements_by_tag_name('td')find_elements_by_xpath('//td')进一步查找其子元素,例如<td>,以获得具体的目标元素。这样即使表格结构发生变化,只要对应的数据单元格结构保持不变,依然可以准确地找到元素。

      从找到的<tr>元素中选取第一个 <td> 元素示例(假设目标元素位于第一个数据列中):

      first_data_cell = dynamic_tr_element.find_elements_by_tag_name("td")[0]
      

      或者使用XPath 选取:

      first_data_cell_xpath = "//table[contains(@class,'MOD')]//tr[td[contains(text(),'分析-V1')]]/td[1]"
      first_data_cell = driver.find_element_by_xpath(first_data_cell_xpath)
      

    通过这种方法,您可以确保在表格结构发生变化的情况下,Selenium仍然能够定位到动态变化的元素。记得根据实际情况调整CSS_SELECTOR或XPATH表达式以及索引位置。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月26日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 verilog 非阻塞赋值下的移位拼接错误
  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话