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

Ruby Selenium技术问询:运行时按属性识别元素及获取表格选中状态类

嘿,这两个问题我刚好有经验,给你详细讲讲:

在Ruby Selenium中运行时基于属性识别元素

在Ruby Selenium里,基于属性定位元素主要靠CSS选择器、XPath或者专门的属性定位策略,这里给你几个常用的方法:

  • CSS选择器(推荐):这是最灵活的方式,能直接通过元素的任意属性定位。比如要找aria-label为"consent received"的<i>元素:
consent_element = driver.find_element(:css, 'i[aria-label="consent received"]')

如果属性值不确定,还能支持部分匹配:

  • ^=:匹配属性值开头,比如i[aria-label^="consent"]

  • $=:匹配属性值结尾,比如i[aria-label$="received"]

  • *=:匹配属性值包含某字符串,比如i[aria-label*="consent"]

  • XPath:适合复杂的层级或多属性组合定位,比如你提供的示例路径可以简化成:

consent_element = driver.find_element(:xpath, '//i[@aria-label="consent received"]')

如果需要限定在表格范围内,还可以结合父元素缩小范围:

table_consent_element = driver.find_element(:xpath, '//table/tbody/tr/td[5]/i[@aria-label="consent received"]')
  • ARIA属性直接定位:Ruby Selenium支持专门的:aria_label定位器,写起来更简洁:
consent_element = driver.find_element(:aria_label, "consent received")
收集表格中选中/未提交状态的元素类

针对你提到的表格场景,已提交的行在第5列有带fa-check-circle类的<i>元素,未提交的则没有。这里给你一个可以直接用的代码示例,用来收集所有行的状态类并区分提交状态:

# 先定位到表格的所有行
table_rows = driver.find_elements(:xpath, '//*[@id="main-display"]/div[2]/div[2]/div/table/tbody/tr')

# 用来存储每行的状态信息
row_statuses = []

table_rows.each do |row|
  row_number = table_rows.index(row) + 1 # 行号从1开始计数
  begin
    # 找到当前行第5列的<i>元素
    status_icon = row.find_element(:xpath, './td[5]/i')
    # 获取元素的class属性值
    icon_class = status_icon.attribute('class')
    # 判断是否已提交(根据是否包含fa-check-circle类)
    is_submitted = icon_class.include?('fa-check-circle')
    
    row_statuses << {
      row: row_number,
      class: icon_class,
      submitted: is_submitted
    }
  rescue Selenium::WebDriver::Error::NoSuchElementError
    # 处理该行没有<i>元素的情况
    row_statuses << {
      row: row_number,
      class: nil,
      submitted: false
    }
  end
end

# 输出收集到的结果,方便调试
row_statuses.each do |status|
  puts "第#{status[:row]}行: 类='#{status[:class]}' | 已提交? #{status[:submitted]}"
end

测试时的用法

如果你要写测试用例,可以基于收集到的状态做断言:

# 验证第3行是已提交状态
third_row = row_statuses.find { |s| s[:row] == 3 }
assert third_row[:submitted], "第3行应该处于已提交状态"

# 验证第4行是未提交状态
fourth_row = row_statuses.find { |s| s[:row] == 4 }
assert_not fourth_row[:submitted], "第4行应该处于未提交状态"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:28:27