如何在子类中获取包含特定字符串的某些div数组元素

时间:2013-03-27 08:39:16

标签: ruby watir

如何获取数组中的每个div元素ID并包含我需要的特定字符串,其中包含元素子类theText。

<div id="corporaContainer" class="fullList">
  <div id="c-ff7c1098-8183-4c89-b3ec-b2587aa6d372" class="resItem clearfix">
    <div class="resTitle">
      <span id="filter-ready" class="statBall statFile ready" title="Status: ready"></span>
      <span class="theText"></span>
    </div>
  <div class="resType"></div>
  <div class="resSize"></div>
  <div class="resPermission public"></div> 
  <div class="resDomain"></div>
  <div class="resDescr"></div>
  <div class="resDetails clearfix" style="display:none;"></div>

   

我试图在每个ID上创建一个循环数组并检查.include?功能。 但迄今为止没有成功。

我需要脚本跳过每个div元素并检查它是否包含我需要的字符串,然后将元素ID值存储在数组中以便稍后使用此ID。

添加了我目前制作的脚本代码。

@b = Watir::Browser.new :chrome, :switches => %w[--disable-plugins --ignore-certificate-errors --disable-popup-blocking --disable-translate --disable-translate]
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
require_relative "1_login.rb"

# Ieiet Corpora sadaļā
@b.div(:id, "pageHeader").link(:text, "Corpora").click

lietotajs = @b.div(:class, "userRealName").text
dzesamie_korpusi = @b.div(:id, "corporaContainer", :class => "fullList")


korpusu_id = []
dzesamie_korpusi.each do |korpuss|
    id = korpuss.attribute_value "id"
    id = id[-38..-1]
    korpusu_id.push(id)
end

我到目前为止尝试过脚本循环通过corporacontainer下的每个DIV元素并获取div元素id以将ir存储在数组中,但是这个确切的代码会返回一个错误,使得它期望Hash标记或者如何处理它现在

2 个答案:

答案 0 :(得分:0)

我了解到,对于包含div后代节点id=corporaContainer的每个div子节点,您正在查找span个根class="theText" id }。并且您希望获得那些div子节点的nokogiri。为此,我使用file.html解析HTML / XML / CSS文档。

<div id="corporaContainer" class="fullList"> <div id="c-ff7c1098-8183-4c89-b3ec-b2587aa6d372" class="resItem clearfix"> <div class="resTitle"> <span id="filter-ready" class="statBall statFile ready" title="Status: ready"></span> <span class="theText"></span> </div> <div class="resType"></div> <div class="resSize"></div> <div class="resPermission public"></div> <div class="resDomain"></div> <div class="resDescr"></div> <div class="resDetails clearfix" style="display:none;"></div> </div> <div id="c-e5f0fe33-06a0-4685-8fe2-f789893bd8e2" class="resItem>clearfix"></div> </div>

require 'nokogiri'

root_id = 'corporaContainer'
filter = 'theText'

File.open('file.html') do |file|
  nodes = Nokogiri::HTML(file)

  nodes.xpath("//div[@id=\"#{root_id}\"]/div").each do |node|
    puts node['id'] unless node.xpath(".//span[@class=\"#{filter}\"]").empty?
  end
end

脚本

c-ff7c1098-8183-4c89-b3ec-b2587aa6d372

结果,您拥有正在寻找的ID

{{1}}

答案 1 :(得分:0)

当你说'一个字符串'时,你不希望这个已知文本出现在哪里。如果您正在查找div中某处的文本(请注意页面上的“文本”和可见(通常)中的文本..不是元素定义中的字符或元素的某些属性的值)

browser.div(:id => "corporaContainer").divs(:text => /TestAuto\s.*/).each do |div|
  puts div.attribute_value("id")
end

如果已知的东西是属性的值,并且属性名称是常量,类似于span的类,并且span总是嵌套在具有您想要的ID的容器对象下面的某个可预测级别的容器对象中,那么这样的事情可能有用(我没有简单的方法来测试,所以试试自己,看看你是否得到了你想要的东西)

browser.div(:id => "corporaContainer").spans(:class => /TestAuto\s.*/).each do |span|
  puts span.parent.parent.attribute_value("id")
end