xpathでcontainsを使用する方法を教えてもらえますか?ユーザーが追加されるとxpathが常に変更されるため、xpathを使用して要素を見つけることができません。
これは私のxpathです:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[9]/td/table/tbody/tr/td[1]/strong[2]
新しいユーザーが追加されたときの変更:
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
その方法を教えてください。
コメント
- 検索しようとしているHTMLと要素を共有します。
回答
ExtJSアプリケーションをテストしました。ほとんどのページ要素属性は動的です。新しいユーザーなどを追加するたびに変化するだけでなく、アプリケーションを開くたびに変化します。
見つけましたツール(Firebugなど)から取得したxpath式はあまり役に立ちません。理由は次のとおりです。
- 読みにくい
- 簡単に壊れます
- デバッグが難しい
代わりに、HTMLを調べて、動的ではない可能性のある一意の属性を特定し、独自の式を考え出すことです。属性はstatiですc特定の要素については、親/子/兄弟関係を持つ静的属性を持つページ上の他の要素を使用して検索します。
私はよく「含む」を使用しますが、それ以上のものがあります。次にいくつかの例を示します。
- 複数の条件:
//div[@class="bubble-title" and contains(text(), "Cover")]
- 部分一致:
//span[contains(text(), "Assign Rate")]
- 開始:
//input[starts-with(@id,"reportcombo")]
- 値にスペースがあります:
//div[./div/div[normalize-space(.)="More Actions..."]]
- 兄弟:
//td[.="LoadType"]/following-sibling::td[1]/select"
- より複雑:
//td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]
その他のアイデアについては、W3CXSL関数のページをご覧ください。
編集:リンクが更新されました。編集2:XPATHが変更されました
コメント
- すばらしい例です!私は'同様の方法を使用して、多くの動的フォームを使用してJSFアプリを自動化します。 ' W3C仕様が非常に便利であることがわかりました。
- それを知ってうれしいです誰かが同じ道を歩いた!ありがとうございます!
- 以前のW3C仕様リンクは現在機能していません。代わりに、このページを参照してください。
回答
わかりやすくするために、xpathを分割して個々のテーブルをフェッチする必要があります。
次のことをお勧めします。
// Get the content or container WebElement content = driver.findElement(By.id("contentText")); //Get the table of users WebElement tblUsers = content.findElement(By.xpath(".//table/tbody/tr[2]/td/table/tbody/tr/td[1]/table")); // Get the rows which change always as and when users are added WebElement allUsers = tblUsers.findElements(By.xpath(".//tbody/tr")); // Loop through each row of users table for(WebElement user : allUsers) { // Get the username WebElement username = user.findElement(By.xpath(".//td/table/tbody/tr/td[1]/strong[2]")); System.out.println("Username: " + username.getText()); }
コメント
- これは'実際には
contains
の使用方法の例を提供していません
回答
By.xpath("//td[contains(lower-case(text()),"youruser")]") //to handle case sensitivity. Here user is not case sensitive
回答
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2]
XPathを大幅に短縮する必要があります。異なるブラウザでテストしている場合は失敗する可能性が高く、ページ上で何かが変更された場合、間違った要素を参照しているために誤検知がスローされる可能性があります。 「RelativeXPaths」と「XPathAxes」を検索することをお勧めしますが、HTMLとWebページのスクリーンショットを投稿すると、より良いXPathを示すことができます。
投稿内容に基づいて、次のようなことができます://table[@id ="something"
または@class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row")
または./text() = "Exact Text Match"]//strong[2]
通常、テーブル行では、行内のセルからのテキストに基づいて行を識別します。 //table[@id ="something"
または@class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row")
または./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match")
または./text() = "Exact Text Match"]
回答
以下のコードを試してください:
public List<WebElement> getText(String xpath) throws Exception { return driver.findElements(By.xpath(xpath)).getText(); } if(tool.getText("//\*[@id="contentText"]//\*/table//\*/strong").contains("<yourtext>")) { system.out.println("Your text is available in the particular xpath"); } else { system.out.println("Your text is not available in the particular xpath"); }
それは私にとってはうまく機能しています。上記のコードを使用して、任意のxpathで任意のテキストを見つけることができます。
回答
XPathの2つがtr[9]
からtr[10]
。 3番目の「tr」の番号はユーザー番号を意味しているようです。
私の練習では、その番号を削除すると、HTMLからすべてのユーザーのデータを抽出できます。(RSelenium + rvestでテスト済み):
.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr/td/table/tbody/tr/td[1]/strong[2]
回答
すでに多くの回答がありますが、以下のリンクを参照することもできます:
回答
XPATH
driver.findElement(By.xpath("/html/body/div/input[1]")).sendKeys("123"); driver.findElement(By.xpath("//input[1]")).click(); driver.findElement(By.xpath("(//input[1])[4])")).click(); driver.findElement(By.xpath("//tag[@AN="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[text()="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[@AN="AV" and @AN="AV"]")).click(); driver.findElement(By.xpath("//tag[contains(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[contains(@AN,"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(@AN,"usrn")]").getText(); ex : //input[starts-with(@id,"reportcombo")]