2013-03-05 5 views
0

Учитывая этот HTML код:Возможно ли получить значение ввода с помощью xpath для поиска по значению соответствующей метки?

<tr> 
    <td class="label">Description</td> 
    <td class="data"><div>QA Test Customer</div></td> 
</tr> 

Попытка написать метод Ruby, который будет принимать два параметра «Описание» и «QA Test Клиент» и утверждать, что значение входного сигнала с меткой «Описание» в факта «QA Test Customer» с использованием Selenium WebDriver и XPath.

Не знакомство с xpath, и поэтому я борюсь. Я знаю, что мне нужна строка xpath, которая будет:

"find a <td> with class of 'label' that has a value of 'Description' then get the value of the <div> embedded in the following <td> with class of 'data' 

Любые указатели приветствуются!

ответ

1
//td[@class='label' and .='Description']/following-sibling::td[@class='data']/div 
+1

, чтобы уточнить ответ wst '. = 'Description'' также можно было бы написать' text() =' Описание'' '.' Здесь называется контекстным узлом, или n ода с индексом – JWiley

+0

@JWiley Хорошая точка, это более читаемо. – wst

+0

Я уверен, что я делаю что-то неправильно ... но я не могу заставить этот запрос xpath работать. Есть идеи? –

1

Это написано для Nokogiri. Я не знаю, если Селен использует Nokogiri, или его собственный XML-анализатор, поэтому он не может помочь ....

Я предпочитаю CSS, потому что это в целом менее многословным и легче понять:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<tr> 
    <td class="label">Description</td> 
    <td class="data"><div>QA Test Customer</div></td> 
</tr> 
EOT 

doc.at('td.label + td.data').text 
=> "QA Test Customer" 

doc.at('td.label + td.data').text == 'QA Test Customer' 
=> true 

Это просто ищет первый <td class="label"> с последующим его собрата с <td class="data">, но мы можем добавить в поисках текста тоже:

!!doc.at(%Q/td[class="label"]:contains("Description") + td[class="data"] div:contains("QA Test Customer")/) 
=> true 

Токарный, что в метод можно назвать становится:

def td_match(doc, s1, s2) 
    !!doc.at(%Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/) 
end 

и назвав его в IRB:

irb(main):024:0> def td_match(doc, s1, s2) 
irb(main):025:1>  !!doc.at(%Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/) 
irb(main):026:1> end 
=> nil 
irb(main):027:0> td_match(doc, 'Description', 'QA Test Customer') 
=> true 

Очистка это немного:

def td_match(doc, s1, s2) 
    !!doc.at(
    %Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/ 
) 
end 

Или, добавив его в Nokogiri :: HTML :: Документ:

class Nokogiri::HTML::Document 
    def td_match(s1, s2) 
    !!self.at(
     %Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/ 
    ) 
    end 
end 

doc.td_match('Description', 'QA Test Customer') 
=> true 
+0

Nice работы олово Человек. Я использовал Nokogiri в другом проекте, чтобы сделать небольшую скрипинг и рассмотрел это. Учитывая, что вы бросили мне софтбол, я все это делаю! –

+0

Дошел до doc.at ('td.label + td.data'). Текст в вашем первом простом примере, и я получаю «неопределенный метод« текст »для nil: NilClass (NoMethodError)». Кажется странным, поскольку мы проходим в HTML, поэтому мы знаем, что doc не является nil ... –

+0

Это не значит, что 'doc' - это нуль, это то, что аксессуар не находит теги с этими классами рядом друг с другом. В результате Nokogiri возвращает 'nil', а' nil.text' не является определенным методом. Возможно, образец HTML не был точным изображением реального HTML? –

 Смежные вопросы

  • Нет связанных вопросов^_^