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式の間に一意のマッピングがないため、一般的な解決策は不可能です。しかし、xml / htmlについて何か知っているなら、それを自分で書くのは簡単かもしれません。要素から始めて、を使用してツリーを上に移動し、parent
式を生成します。
使用する検索関数が何であれ、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]"'
ます。元の要素検索で探していたものが返されたと想定されているためです。