如何用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
相关产品推荐
相关产品推荐

