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