如何使用Watir获取元素的ID,其中子元素包含我搜索的字符串

时间:2014-01-10 14:58:43

标签: ruby watir watir-webdriver

<div class="wrapper">
<div id="minHeightBlock" style="min-height: 430px;">
<div class="borderbox"><div class="standaloneBox">
<div class="sysHeaderContainer clearfix"> … </div>
<div class="notesForGuests"> … </div>
<div class="filterBox clearfix"> … </div>
<div class="resListHeader"> … </div>
<div id="corporaContainer" class="fullList">
<div id="c-a06ffa6a-dc62-4640-9760-dbd661c7ffe8" class="resItem clearfix">
    <div class="resTitle">
    <span id="filter-empty" class="statBall statFile empty" title="Status: Empty corpus"></span>
    <span class="theText">
      12321 corpora
    </span>
</div>
    <div class="resType"> … </div>
    <div class="resSize"> … </div>
    <div class="resPermission private"> … </div>
    <div class="resDomain"> … </div>
    <div class="resDescr"> … </div>
    <div class="resDetails clearfix" style="display:none;"> … </div>
</div>
<div id="c-b8c0faba-e662-4998-836f-0ee58009b7fa" class="resItem clearfix"> … </div>
<div id="c-9d02b887-4835-4606-ad4b-775b39af9f48" class="resItem clearfix"> … </div>
<div id="c-021d3ba1-db03-4c4e-81a5-294737eb5b54" class="resItem clearfix"> … </div>

这是我尝试使用Watir编写脚本的网页代码。我所知道的只是元素应包含的跨度文本。我有很多这些元素,我需要收集所有元素ID值,以便我可以在进一步的操作中使用它们。

我已经在上面的代码中记录了我所知道的以及我需要得到的东西。

到目前为止,我已尝试过此代码:

    @b.div(:id, "pageHeader").link(:text, "Corpora").click
sleep 5 
@b.div(:id, "corporaContainer").spans(:text => /TestAuto\s.*/).each do |span|
    puts span.parent.attribute_value("id")
end

但没有完成输出。也许我做错了什么。帮我把这个坚果壳破了。

1 个答案:

答案 0 :(得分:1)

你的尝试很接近。问题是span.parent仅上升到<div class="resTitle">。你需要再多上一个父母:

@b.div(:id, "corporaContainer").spans(:text => /corpora/).each do |span|
  puts span.parent.parent.attribute_value("id")
end

(请注意,我更改了spans定位器中的文字,因为TestAuto\s.*与示例html不匹配。)

或者,我有时会发现找到包含span的div更好。这样您就不必担心父母的变化数量了:

p @b.divs(:class => 'resItem')
  .find_all { |div| div.span(:text => /corpora/).exists? }
  .collect { |div| div.id }
#=> ["c-a06ffa6a-dc62-4640-9760-dbd661c7ffe8"]

以下是一个工作示例。请注意,有两件重要的事情:

  • 结果列表是异步加载的。因此,在捕获结果之前,您需要等待列表完成加载。 sleep(5)可能会有效,但您最好使用实际的等待方法(因为它似乎需要超过5秒)。
  • 确保搜索文本实际存在于页面上。在下面的示例中,示例html中没有提到“12321语料库”标题。

示例:

require 'watir-webdriver'

# Title to search for:
title_text = /UniAdm/

# Go to the Corpora page:
@b = Watir::Browser.new :ff
@b.goto "https://www.letsmt.eu/Corpora.aspx"

# Wait for the results to load:
container = @b.div(:id, "corporaContainer")
container.div(:class => 'resItem').wait_until_present

# Find the matching ids:
p container.divs(:class => 'resItem')
  .find_all { |div| div.span(:class => 'theText', :text => title_text).exists? }
  .collect { |div| div.id }
#=> ["c-87ee80a9-e529-48b2-92be-bc8d76375478", "c-f139e781-4789-41f9-82e8-914e0e3eff81", "c-e17641d2-9364-4e87-9047-ba35580dc32f"]