Получить значение определенного идентификатора элемента css из дочернего элемента css
Я использую Веб-драйвер Selenium, завернутый в PHPUnit и Колбасу, чтобы проверить нажатие кнопки в определенной строке таблицы, которая выложена аналогично:
<tr id="dynamically generated 1">
<td class="foo">
<div class="bar"></div>
</td>
<td class = "mybutton">
<span class = "icon clickable"></span>
</td>
</tr>
<tr id="dynamically generated 2">
<td class="foo">
<div class="baz"></div>
</td>
<td class = "mybutton">
<span class = "icon clickable"></span>
</td>
</tr>
В частности, я хочу щелкнуть определенный элемент #mybutton > span.icon.clickable
, чей брат .foo
с ребенком .baz
. ", чей брат .foo
имеет ребенка .baz
" требование - это единственный способ, которым я могу в настоящее время определить правильный элемент, так как другие строки в той же таблице имеют элемент #mybutton > span.icon.clickable
, и идентификаторы для этих строк генерируются динамически.
На данный момент я использую XPath, но, как и следовало ожидать, производительность на FF
и IE
ужасающая. Существует ли способ извлечения значения tr#id
из элемента tr#id div.bar
? Если я смогу это получить, я смогу использовать идентификатор, чтобы использовать CSS для поиска элемента, который я ищу. Я использую PHP, но решение на любом языке было бы полезно.
В качестве альтернативы, более простое решение CSS3 будет работать, но после довольно большого читая, я почти пришел к выводу, что использование стандартного селектора CSS3 в данном случае не подходит. На всякий случай, если я что-то упускаю, есть ли для этого решение CSS3? Я знаю, что есть решение CSS4, но мне нужна полная поддержка браузера, поэтому, пока все браузеры, которые я тестирую, не поддержат CSS4, мне придется полагаться на CSS3.
Заранее благодарю.
РЕДАКТИРОВАТЬ: До тех пор, пока не будет улучшена кроссбраузерная поддержка CSS4, мне нужно использовать CSS3
3 answers
Единственный способ, которым я могу это сделать, - это найти List<WebElement>
, сгенерированный By.cssSelector(".foo~span.icon.clickable")
, и на каждом элементе выполнить findElement(By.cssSelector(".baz"))
, окруженный try/catch (ловить NoSuchElementException
s).
Когда ошибка не возникает, вы знаете, что нашли свой элемент.
Примечание: ~
выбирает его, если у него есть КАКИЕ-ЛИБО исходящие .foo
братья и сестры. Если вы хотите, чтобы это был непосредственно предыдущий брат или сестра, используйте +
Нет способа CSS выбрать это, потому что для этого потребуется селектор, который просматривает предыдущие элементы, что недоступно в CSS3.
Однако в jQuery это было бы довольно просто. Я сделал селектор для вашей ситуации
$(".foo").has(".baz").siblings(".mybutton").find("span.icon.clickable").addClass('red');
-
$(".foo")
- выбирает элементы с классомfoo
-
.has(".baz")
- возвращает только элементы, у которых есть брат или сестра с классомbaz
. В этом случае.foo
с элементом.baz
-
.siblings(".mybutton")
- ищет элемент с классmybutton
на том же уровне, что и предыдущий элемент. Поскольку мы использовалиhas()
вместо.foo .baz
, это все равно будет нацелено на элемент.foo
-
.find("span.icon.clickable")
- ищет нисходящий интервал от предыдущего элемента с классамиicon
иclickable
-
.addClass('red');
- просто функция для завершения примера
В css есть селектор братьев и сестер, называемый ~
, и есть некоторые селекторы css4
, которые могут помочь.
Возможно, это сработало бы, если бы я правильно понял требование:
#mybutton > .foo ~ span.icon.clickable! > .baz
Это должно работать в chrome, но его css4, так что, вероятно, он не будет работать во многих браузерах.
Подсказка: Он выбирает span.icon.clickable
, у которого есть ребенок .baz