2012-09-10 42 views
2

以下面的html爲例。它是我製作的一張臨時表單,但它有我正在嘗試使用的真正的html代碼片段。Watir:使用bgcolor標籤搜索表格單元格並獲取列號

http://www.carbide-red.com/prog/test_table.html

我試圖找到一個欄和唯一的標識符洽我能找到的是背景色(BGCOLOR)。

<tr bgcolor="#ffffcc"> 
    <td bgcolor="yellow" class="date" align=center>Equipment</td> 
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/12/12</font></td> 
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/19/12</font></td> 
    <td bgcolor="#ccccff" align=center class="date"><font color=black>8/26/12</font></td> 
    <td bgcolor="#ccccff" align=center class="date"><font color=black>9/2/12</font></td> 
    <td bgcolor="red" align=center class="date"><font color=yellow>9/9/12</font></td> 
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/16/12</font></td> 
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/23/12</font></td> 
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>9/30/12</font></td> 
    <td bgcolor="#ccffcc" align=center class="date"><font color=black>10/7/12</font></td> 
</tr> 

我試圖找到具有bgcolor = red的<td>。然後,我想保存該單元格的列索引,以便我可以使用它來選擇下列行中的同一列。

但我似乎無法找到一種方法來搜索bgcolor=標記。而我一直無法找到一種方法讓Watir報告列/行索引存儲在一個變量中。但是如果我能找到bgcolor=標籤,那麼我可以搜索「設備」,然後計數,直到找到正確的標籤。

我知道html代碼並不理想,因爲有任何「名稱」或任何唯一標識符,但我不能改變這一點。

我對Ruby非常新穎& Watir。我試圖在Perl中操作一個網站,但它不是很順利,我發現了Watir,它正是我所需要的(而且非常容易),但現在我正在嘗試理解Ruby以及更精細的語義。

感謝您的幫助!

回答

1

要獲得<td bgcolor="red">文本試試這個:

browser.element(:css => "td[bgcolor=red]").text 

你應該回去"9/9/12"。要點擊元素,請將text替換爲click

爲了把它的指數變量index試試這個:

index = nil 
browser.tds.each_with_index {|td, i| index = i if td.attribute_value("bgcolor") == "red" or td.attribute_value("bgcolor") == "#ff0000"} 

index變量應該是5

+0

我也會試試這個,因爲它不需要額外的寶石。 – Westrock

+0

第二行不會打印任何內容。它不會出錯,但不會創建額外的行,如「if」不被滿足。也是的,如果你能展示如何把它變成一個變量請(只要做variablename = code?)。 – Westrock

+0

它看起來像IE(watir-classic或watir-webdriver)總是返回bgcolor的十六進制代碼。嘗試使用「#ff0000」而不是「紅色」。 –

1

,如果我是你,我會用引入nokogiri:

doc = Nokogiri::HTML @browser.html 
td = doc.at('td[@bgcolor="red"]') 
index = td.search('./preceding-sibling::td').length 

除非有在頁面上的JavaScript棘手你可能與機械化比的Watir更好。

0

是的,我正在處理的網頁使用Javascript,這就是爲什麼我很難在Perl下使用Mechanize :: Firefox。 Watir工作得更順利。

謝謝您的建議!它一開始並沒有工作,但它幫助我進行了Google搜索,並且我能夠獲得一個工作版本。

require "watir" 
require "nokogiri" 

browser = Watir::Browser.new 
browser.goto "http://www.carbide-red.com/prog/test_table.html" 

doc = Nokogiri::HTML.parse(browser.html) 
td = doc.at('td[@bgcolor="red"]') 
columnindex = td.search('./preceding-sibling::td').length 

puts columnindex 
browser.close 

這回 「5」

更新:

爲他人着想誰可能會發現這一點的同時搜索和學習。要使用columnindex變量來找到行內的特定列使用此代碼:

textvariable = browser.td(:text => "A58004").parent.td(:index => "#{columnindex}").text 
puts "Textvariable: #{textvariable}" 

此找到<td>包含術語「A58004」,然後在進入到第5列(0-5),並返回該單元格的值。使用我原來的問題鏈接的網頁將是「W = Sa」