Найти CSS Selector имея id другого элемента в этом же ряду (внутри таблицы)

Пытаюсь решить вот такую задачу, есть таблица -


Мне нужно нажать на кнопку “View PDF”
Но в этом ряду уникальный локатор только у первого столбца в таблице
tbody tr input[value*='35702']

Возможно ли как-то “танцуя от него” нажать на вью пдф?

Попробуйте это Child and Sibling Selectors | CSS-Tricks - CSS-Tricks но я не уверен что поможет.
Не проще ли использовать #xpath ? #css-selectors не такие гибкие.

1 лайк

В данном случае только #xpath , только он позволяет двигаться по #dom дереву вперед/назад.

не знаю, что внутри td, который по середине, но если там нет a можно попробовать:

tbody>tr>td>div>a 

или

table[class*='table']>tbody>tr>td+td+td+td+td+td+td+td>div>a

но лучше в данном случае #xpath !

C помощью css нельзя такого сделать. Лучше через #xpath

//*[contains(@id, '35702')]//..//а[.='View PDF']

Или если у вас selenide, то можно

$("[id*='35702']").parent().$(withText("View PDF")).click();

Но всё же как видишь чуть короче с помощью xpath

2 лайка

зачем вообще строить #xpath или #css если у #webdriver есть findElement(By.link_text)? в питоне я уверен есть тоже аналог.

Если findElement(By.link_text) работает, и такая линка одна - делайте так. чем проще локатор тем лучше.

Если вышеприведенный способ не подходит, то стоит помнить - при построении локаторов лучше избегать неопределенных ситуации. в данном примере использование непривязанного к элементу шага назад /…/ не критично. Между элементами tr и td не может появиться чегото нового по определению. В других случаях, незначительные изменения верстки могут свалить ваши тесты.

Чтобы сделать ваши xpath более стабильными явно привязывайтесь к элементам.

//input[contains(@id, '35702')]/ancestor::tr//а[text()='View PDF']

В данном случае у tr нет никаких атрибутов. В случае другого элемента стоит их указать.

1 лайк

В таблице такое не прокатит. Потому, что этот линк тект будет дублироваться