是否有一种get_xpath
方法或方法可以在 selenium 或 lxml.html 中完成类似的事情。我有一种感觉,我在某个地方看到过,但在文档中找不到类似的东西。
伪代码来说明:
browser.find_element_by_name('search[1]').get_xpath()
>>> '//*[@id="langsAndSearch"]/div[1]/form/input[1]'
这个技巧在 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
.
无论您使用什么搜索功能,您都可以使用 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]"'
. 因为假设是您的原始元素搜索返回了您正在寻找的内容。
由于元素和 xpath 表达式之间没有唯一的映射,因此不可能有一个通用的解决方案。但是,如果您对您的 xml/html 有所了解,那么您自己编写它可能会很容易。只需从您的元素开始,使用 走上树parent
并生成您的表达式。