4

是否有一种get_xpath方法或方法可以在 selenium 或 lxml.html 中完成类似的事情。我有一种感觉,我在某个地方看到过,但在文档中找不到类似的东西。

伪代码来说明:

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

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

3 回答 3

6

这个技巧在 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.

于 2013-11-17T01:23:16.317 回答
3

无论您使用什么搜索功能,您都可以使用 xpath 重新格式化您的搜索以返回您的元素。例如,

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

将返回完全相同的元素。

话虽如此,我认为用这种方法扩展 selenium 是可能的,但几乎没有意义——您已经为模块提供了查找元素所需的所有信息,为什么要使用 xpath(几乎可以肯定更难阅读?)要这样做吗?

在您的示例中,browser.find_element_by_name('search[1]').get_xpath()将简单地返回'//*@name="search[1]"'. 因为假设是您的原始元素搜索返回了您正在寻找的内容。

于 2012-10-08T20:22:50.777 回答
3

由于元素和 xpath 表达式之间没有唯一的映射,因此不可能有一个通用的解决方案。但是,如果您对您的 xml/html 有所了解,那么您自己编写它可能会很容易。只需从您的元素开始,使用 走上树parent并生成您的表达式。

于 2012-10-08T19:32:32.347 回答