【问题标题】:How to get ID of an element using Watir where the child contains the string i search for如何使用 Watir 获取元素的 ID,其中子元素包含我搜索的字符串
【发布时间】:2014-01-13 07:40:43
【问题描述】:
<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

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

【问题讨论】:

    标签: ruby watir watir-webdriver


    【解决方案1】:

    您的尝试很接近。问题是span.parent 只上升到&lt;div class="resTitle"&gt;。你需要再上一位父母:

    @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"]
    

    【讨论】:

    • 第二个变种不起作用。给我一个输出:Finding_Nemo.rb:17:in &lt;main&gt;': undefined local variable or method browser' for main:Objec t (NameError) Myb 因为我已经定义了:@b = Watir::Browser.new :chrome, :switches => %w [--disable-plugins --ignore-certificate-errors --disable-popup-blocking --disable-translate --disable-translate] ????
    • 对不起,是的。我的本地测试文件使用browser。我已经更新了示例。
    • 但是对于第一个变体和第二个变体,它没有提供任何输出。知道为什么吗? Myb 脚本搜索了这么久。因为我有将近 200 项要搜索。
    • 第二种变体是否正常工作?如果是这样,我猜第一个变体中的定位器是不正确的。如果你做一个puts @b.div(:id, "corporaContainer").spans(:text =&gt; /corpora/).length 你会得到什么?我的猜测是您没有找到跨度,这意味着您的页面 html 实际上与问题中的示例 html 有点不同。
    • 好吧,如果我把 put 放在长度上,那么我得到 0。这意味着脚本没有找到任何跨度。我用更多信息更新了示例。
    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 2020-02-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多