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

如何用Ruby中的Watir从同class列表项中提取特定值?

用Watir从同class的
  • 列表中获取特定值的方法
  • 嘿,我来帮你搞定这个Watir的问题!针对你给出的HTML结构,这里有几种常用的方式来获取目标值:

    首先先明确下你的HTML结构(方便咱们对照代码):

    <li class="CLASSNAME">
      <div class="DIV1">
        <div class="DIV2">
          <div class="DIV3">
            <div class="DIV4">
              <a class="HYPERLINK_CLASSNAME" title="TITLE1">链接文本1</a>
            </div>
          </div>
        </div>
      </div>
    </li>
    <li class="CLASSNAME">
      <div class="DIV1">
        <div class="DIV2">
          <div class="DIV3">
            <div class="DIV4">
              <a class="HYPERLINK_CLASSNAME" title="TITLE2">链接文本2</a>
            </div>
          </div>
        </div>
      </div>
    </li>
    

    1. 先获取所有目标
  • 元素的集合
  • 第一步咱们可以先把所有class为CLASSNAME的

  • 元素都取出来,方便后续操作:

    # 获取所有class是CLASSNAME的li元素
    all_list_items = browser.lis(class: 'CLASSNAME')
    

    这样all_list_items就是一个Watir元素集合,你可以用all_list_items.count看看总共有多少个列表项。


    2. 按索引获取特定位置的列表项

    如果你知道目标项在列表中的位置(注意Watir里索引是从0开始的哦),可以直接通过索引定位:

    # 获取第2个列表项(索引为1)
    target_item = all_list_items[1]
    
    # 然后获取这个项里的a标签的title属性
    target_title = target_item.a(title: /.*/).title
    # 或者获取链接文本
    target_link_text = target_item.a.text
    # 或者获取链接的href属性
    target_href = target_item.a.href
    

    3. 根据的title属性筛选目标项

    如果不知道位置,但知道目标的title值(或者部分值),可以用find方法直接筛选:

    # 找title等于"TITLE2"的列表项
    target_item = browser.lis(class: 'CLASSNAME').find do |li|
      li.a.title == "TITLE2"
    end
    
    # 如果是匹配title包含某个关键词的,比如包含"TITLE"
    target_item = browser.lis(class: 'CLASSNAME').find do |li|
      li.a.title.include?("TITLE")
    end
    
    # 拿到目标项后,同样可以获取需要的值
    if target_item
      puts "找到的title: #{target_item.a.title}"
      puts "链接文本: #{target_item.a.text}"
    end
    

    4. 遍历所有列表项,收集所有符合条件的值

    如果需要把所有符合条件的值都收集起来(比如所有title包含特定词的),可以用select方法:

    # 收集所有title包含"TITLE"的列表项的title值
    all_matching_titles = browser.lis(class: 'CLASSNAME').select do |li|
      li.a.title.include?("TITLE")
    end.map { |li| li.a.title }
    
    # 输出结果
    all_matching_titles.each { |title| puts title }
    

    另外要注意,如果页面元素是动态加载的,可能需要先等待元素出现再操作,比如用wait_until确保元素加载完成:

    browser.lis(class: 'CLASSNAME').wait_until(&:present?)
    

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

  • 相关产品推荐
    方舟 Agent Plan

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

    最近更新时间:2026.05.25 07:44:03