Selenium 2(WebDriver)を使用しています。
ボタンを見つけて、スクリプトをクリックしています。
driver.findElement(By.cssSelector("button:contains('Run Query')"));
または
driver.findElement(By.cssSelector("css=.gwt-Button:contains('Run Query')"))
そのhtmlは次のようなものです:
<button type="button" class="gwt-Button" id="ext-gen362">Run Query</
button>
IDは動的に生成されるため、IDを利用できません。
ContainsのようなものでcssSelectorを使用する方法はありますか?これは可能ですか?
CSSには:contains()
のようなものがないため、CSSセレクターではこれを行うことはできません。それは何年も前に放棄された提案でした。
要素テキストで選択する場合は、XPathセレクターを使用する必要があります。何かのようなもの
driver.findelement(By.xpath( "// button [contains(。、 'クエリの実行']"))
または
driver.findelement(By.xpath( "// [contains(concat( ''、@ class、 '')、 '。gwt-Button')and contains(。、 'Run Query']"))
別のオプションは、jQueryがページに存在する場合、次のように使用することです。
var webElement = ((JavascriptExecutor)driver).executeScript("return jQuery('button:contains(Run Query)')");
含むを使用することはできませんが、代わりにワイルドカードを使用してください。
driver.findElement(By.cssSelector("button:(*'Run Query'*)"));
私は同じ船に乗っており、現在、「含む」を含むXPathセレクターを使用して、特定のテキストコンテンツを持つ要素を検索しています。いくつかは_<td>
_であり、いくつかは大きなテーブル(特定の列、ただし行は事前に不明)の奥深くに_<td><a>
_あります。非常に遅いので(Firefox 20でそのようなテーブルエントリを見つけるためだけに4〜5秒)、CSSを使用してより高速にしたいと思っていました。多くの場合、テキストはそれ自体(完全)であり、それ以外の場合は、無視したいパスの最後にあるファイル名になります。既知の列であるが未知の行であり、_<td>
_または_<td><a>
_(同じテーブルにある場合もある)である可能性がある場合、最速のXPath検索パターンの提案はありますか?私が探しているテキストが(他のテキストの終わりではなく)完全である場合の大部分の場合、等価比較はcontains()よりもはるかに高速ですか? 「startswith」ルックアップがあると思いますが、「endswith」ルックアップはありますか? 「id」を使用するとさらに高速になることはわかっていますが、残念ながら、このHTMLにはここにIDがなく、追加できません。このテキストを含む_<tr>
_を探しているので、同じ行の別の要素を見つけてそのテキストを取得するか、リンクをクリックできます。行の小さなサブセットを見つけてそのテキストを確認することは問題ありませんが、可能であれば_<td>
_と_<td><a>
_を別々に検索することは避けたいと思います。
CSSだけでは、必要なものは得られません。 you cannot テキストでフィルタリングします。 jsを使用して要素のIDを取得するか、適切なテキストのボタンが見つかるまでコード内のすべてのボタンをループすることができます。これがPythonの場合:
[btn for btn in browser.find_elements_by_css_selector('button')
if 'Run Query' in btn.text]
これを簡単に一般化して、ヘルパー関数を作成することもできます。