Selenium/lxml: получить xpath

Есть ли метод get_xpath или способ сделать что-то подобное в селене или lxml.html. У меня такое чувство, что я где-то видел, но не могу найти ничего подобного в документах.

Псевдокод для иллюстрации:

browser.find_element_by_name('search[1]').get_xpath()

>>> '//*[@id="langsAndSearch"]/div[1]/form/input[1]'

person root    schedule 08.10.2012    source источник
comment
Вы просмотрели все поддерживаемые локаторы в официальной документации по адресу release.seleniumhq.org/selenium-remote-control/0.9.2/doc/dotnet/ ? Также есть локатор xpath. Редактировать: похоже, вы хотите сделать обратное - учитывая генерацию элемента DOM и XPath, верно? Я не знаю о такой функциональности, но подключаемый модуль Selenium IDE seleniumhq.org/projects/ide выполняет какое-то преобразование DOM в XPath, поэтому вы можете просмотреть его код.   -  person ccpizza    schedule 09.10.2012


Ответы (3)


Поскольку между элементом и выражением xpath нет уникального сопоставления, общее решение невозможно. Но если вы что-то знаете о своем xml/html, может быть легко написать его самостоятельно. Просто начните с вашего элемента, пройдите вверх по дереву, используя parent, и сгенерируйте свое выражение.

person Achim    schedule 08.10.2012

Этот трюк работает в lxml:

In [1]: el
Out[1]: <Element span at 0x109187f50>

In [2]: el.getroottree().getpath(el)
Out[2]: '/html/body/div/table[2]/tbody/tr[1]/td[3]/table[2]/tbody/tr/td[1]/p[4]/span'

См. документацию по getpath.

person kavinyao    schedule 17.11.2013

Какую бы функцию поиска вы ни использовали, вы можете переформатировать свой поиск, используя xpath, чтобы вернуть свой элемент. Например,

driver.find_element_by_id('foo')
driver.find_element_by_xpath('//*@id="foo"')

вернет точно такие же элементы.

При этом я бы сказал, что расширение селена с помощью этого метода было бы возможно, но почти бессмысленно - вы уже предоставляете модулю всю информацию, необходимую для поиска элемента, зачем использовать xpath (который почти наверняка будет тяжелее читать?) делать это вообще?

В вашем примере browser.find_element_by_name('search[1]').get_xpath() просто вернет '//*@name="search[1]"'. поскольку предполагается, что ваш первоначальный поиск элемента вернул то, что вы искали.

person kreativitea    schedule 08.10.2012
comment
Я думаю, вам нужно включить скобки: '//*[@id=foo]' - person reabow; 28.01.2015