Подняться на несколько уровней, используя XPath

Рейтинг: 0Ответов: 2Опубликовано: 20.01.2015

Дорый день.

У меня есть грид на странице, данные которого можно изменять. При нажатии на ячейку может появиться TextArea, ComboBox или календарь, в зависимости от ячейки.

Проблема в том, что выпадающий контрол появляется не в гриде, а несколько парентов выше.

Данная реализация будет использоваться в selenium, и потому при нажатии определенной ячейки нужно идти вверх от нее, чтобы найти нужный элемент.

Я делаю так:

var parent = element.FindElements(By.XPath("..//..//..//..//..//..//..//..//..//..//*"));

и дальше уже ищу нужний контрол в parent.

Вопрос:

1) как можно лучше написать XPath, чтобы подняться на несколько уровней выше без ..//..//..//, потому что в некоторых местах нужно подниматься на 16 парентов?

2) можно ли как-то через XPath, в моем случае искать конкретный контрол?

Например

if(element.FindElements(By.XPath("..//..//..//..//..//..//..//..//..//..//textArea[class = 'blabla']")).Count > 0)

Как лучше реализовать такую задачу?

Ответы

▲ 1

Если правильно понял, то:

ancestor::textArea[class = 'blabla']

Хотя как textArea может быть чьим-то предком, не совсем понятно. Может быть, так:

ancestor::*/textArea[class = 'blabla']

ЗЫ Для Firefox'а есть плагин Selenium-IDE, там можно найти xpath для элемента, просто кликнув на него.

▲ 1

Самый элегантный из способов, думаю, искать парент,в котором и будут появлятся все дочерние елементы. А потом искать дочерние элементы внутри этого парента, а не внутри документа.

Через ".//ваш xpath" (именно что то конкретное что ты пишешь после "..//..//..//..//..//..//..//..//..//..//")