Получить текст из всех элементов, соответствующих шаблону в Selenium - PullRequest
3 голосов
/ 15 октября 2010

У меня есть сайт с элементами формы:

<td id="subject_23432423">content I want to read</td>

Как использовать Selenium RC (с привязками Python, в частности) для чтения содержимого всех этих элементов?Я прошел через все команды, и, хотя есть много вариантов найти один элемент, ни одна из команд, похоже, не обрабатывает списки из нескольких совпадений.Например, я могу найти содержимое определенного элемента, используя:

content = sel.get_text("td[@id='subject_23432423']")

, но это предполагает, что я уже знаю идентификатор, а я нет, потому что он генерируется динамически.

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Что бы я сделал, это один из следующих методов

count = sel.get_xpath_count("xpath=//td[starts-with(@id,'subject_')]")
someArray = []
for i in count:
  someArray[i] = sel.get_text("xpath=//td[starts-with(@id,'subject_')][" + i + "]")

или для более эффективного использования BeautifulSoup или lxml

html = sel.get_html_source()
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(html)
#use beautifulsoup to do what you want
3 голосов
/ 15 октября 2010

Это невозможно при использовании API Selenium 1, однако вы можете вызвать JavaScript, который будет находить элементы, используя XPath //td[contains(@id, "subject_")], если subject_ всегда присутствует в сгенерированном идентификаторе.Я не уверен, обеспечивает ли браузер Selenium поддержку XPath для IE, поэтому вы можете ограничиться браузерами, которые имеют встроенную поддержку.В Firefox это будет:

var tds = document.evaluate("//td[contains(@id, \"subject_\")]", document, null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
for ( var i = 0; i < tds.snapshotLength; i++) {
   var td = tds.snapshotItem(i);
   // get text using td.textContent and add it to array or whatever...
   // and return it
}

return ...

Вам нужно будет объявить этот скрипт как строку в вашем коде и выполнить через selenium.getEval

Однако, если вы сможете переключиться на Selenium 2 (WebDriver) , вы можете использовать его API.Вам нужно будет использовать findElementsBy, передающий XPath //td[contains(@id, "subject_")], а затем пройтись по возвращенному массиву совпадений и получить текст каждого элемента

1 голос
/ 21 октября 2010

Это, безусловно, должно быть возможно в Selenium, поскольку этот тип вещей отлично работает в TestPlan (который использует Selenium и HTMLUnit в качестве бэкэнда).В этом случае простой скрипт TestPlan может выглядеть следующим образом.

for %Element% in (response //td[starts-with(@id,'subject_')])
  Notice %Element%
end

Преобразование в строку вызывается автоматически при написании уведомления, но сохранить его в массиве так же просто.

0 голосов
/ 02 апреля 2014

В Selenium 2

Можно проверить

Список субъектов = driver.findElements (By.xpath ("// td [содержит (@id, 'subject_')]"))int size = subjects.size ();

...