xpathでcontainsを使用して要素を見つける方法

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式はあまり役に立ちません。理由は次のとおりです。

  1. 読みにくい
  2. 簡単に壊れます
  3. デバッグが難しい

代わりに、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] 

回答

すでに多くの回答がありますが、以下のリンクを参照することもできます:

https://medium.com/edureka/xpath-in-selenium-cd659373e01a

XPathチートシート

回答

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")] 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です