2014-01-10 2 views
0
<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 값을 압축해야합니다.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

당신의 시도는 가까와졌습니다. 문제는 span.parent<div class="resTitle">까지만 올라갑니다. 당신은 또 하나의 부모까지 이동해야합니다 : (. 내가 샘플 HTML과 일치하지 않은 spans 이후 TestAuto\s.*의 로케이터의 텍스트를 변경합니다)

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

또는 가끔 더 잘 찾을 수 범위가 포함 된 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 corpora"제목은 없습니다.

예 :

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"] 
+0

번째 변형 밤은 가공. '

': 정의되지 않은 지역 변수 또는 메인에 대한 메소드'browser ': Objec t (NameError) Myb의 정의는 다음과 같습니다. @b = Watir :: Browser .new : chrome, : switches => % w [- disable-plugins --ignore-certificate-errors --disable-popup-blocking --disable-translate --disable-translate] ??? –

+0

죄송합니다, 예. 테스트를위한 나의 로컬 파일은'browser'를 사용하고있었습니다. 예제를 업데이트했습니다. –

+0

그러나 첫 번째 변종과 두 번째 변이로 어떤 결과물을 제공합니까? 왜 그런가? Myb 스크립트가 너무 오래 검색 중입니다. 왜냐하면 나는 거의 200 개의 아이템을 검색 할 수 있기 때문이다. –

관련 문제