Seleniumで既知の要素の親要素を選択します


116

Selenium 1で選択できる特定の要素があります。

残念ながら、目的の動作を得るには、親要素をクリックする必要があります。私が簡単に見つけることができる要素は、属性を選択できないため、クリックできない。XPathで上方向に移動するにはどうすればよいですか?

回答:


169

そこにはいくつかのオプションがあります。サンプルコードはJavaですが、他の言語への移植は簡単です。

JavaScript:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
                                   "return arguments[0].parentNode;", myElement);

XPath:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));

からドライバーを取得する WebElement

注:ご覧のとおり、JavaScriptバージョンにはが必要driverです。直接アクセスできない場合は、以下WebElementを使用して取得できます。

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

41
また、祖父母に移動する場合は、By.Xpath( "../ ..")を使用します。
Monsignor 2013

単にファイルパス...またはURLパスのような@Monsignor作品:stackoverflow.com/questions/8577636/../../questions/8577636/...
jpaugh

これらのXPathはいずれも、Seleniumでの使用に適していません。を使用By.xpath(“./..”)する場合、DOMツリーを正しくウォークアップするためにを使用する必要がありますelement.findElement。コンテキストノードを設定するには、先頭の「./」が必要です。
JimEvans

35

もう少し XPath axes

以下のHTML構造があるとしましょう:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*-返す任意の直接の親である要素を。

この場合、出力は <div class="parent">

  1. //span/parent::div[@class="parent"]-戻る親要素のみ正確なノードタイプのとのみ指定された述語が真である場合。

出力: <div class="parent">

  1. //span/ancestor::*- すべての祖先(親を含む)を返します。

出力:<div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor">...

  1. //span/ancestor-or-self::*- すべての祖先現在の要素自体を返します。

出力:<span>Child</span><div class="parent"><nav class="second_level_ancestor"><div class="third_level_ancestor">...

  1. //span/ancestor::div[2]-タイプの(親から始まる)2番目の祖先を返しますdiv

出力: <div class="third_level_ancestor">


こんにちは@アンダーソン私の質問について助けが必要です調べる時間はありますか?前もって感謝します。stackoverflow.com/questions/54647055/...

18

あなたのDOMを

<a>
    <!-- some other icons and texts -->
    <span>Close</span>
</a>

<span>テキストに基づいて親タグ「a」を選択する必要があるので、次を使用します

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

説明:子ノードの値に基づいてノードを選択してください


div複数のdivで再びネストされているものを探している場合は.//spanBy.xpath("//div[.//span[text()='Close']]")を使用する代わりに、*//span指定されたスパンのほとんどの親div要素を探します。これは次のようになりますdriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
Jai Prak


5

これは他の人にとって役立つかもしれません:このサンプルHTMLの使用

<div class="ParentDiv">
    <label for="label">labelName</label>
    <input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
    <label for="animal">pig</label>
    <input type="button" value="elementToSelect">
</div>

たとえば、同じセクション(divなど)の要素をラベルとして選択する場合は、これを使用できます

//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect'] 

これだけの手段、ラベルの外観は(それはのような何かをできたah2)と呼ばれますlabelName。そのラベルの親(つまりdiv class="ParentDiv")に移動します。その親の子孫内を検索して、の値を持つ子要素を見つけますelementToSelect。これによりelementToSelectDontSelectdivを親とする2番目は選択されません。

トリックは、最初に親に移動し、次にその親の子孫で必要な要素を検索することにより、要素の検索領域を減らすことができるということです。他のような構文following-sibling::h2もいくつかのケースで使用できます。これは次の兄弟要素を意味しますh2。これは、同じ親を持つ同じレベルの要素に対して機能します。


0

これを行うには、xpathで/ parent :: node()を使用します/ parent :: node()を子要素のxpathに追加するだけ です。

例:子要素のxpathをchildElementXpathとします。

その場合、直接の祖先のxpathはchildElementXpath / parent :: node()になります。

次の祖先のXpathは、childElementXpath / parent :: node()/ parent :: node()になります。

等々..

また、を使用して要素の祖先に移動することもできます 'childElementXpath/ancestor::*[@attr="attr_value"]'。これは、一意であるが一意的に識別できない親要素がある既知の子要素がある場合に役立ちます。


0

次のように、Seleniumを使用して親タグを選択できます。

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

これは、既知のエレメントの祖父母を見つけるのに役立ちます。すぐに親要素を見つけるには、1つ(/ ..)を削除するだけです。

お気に入り:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

これを実装する方法は他にもいくつかありますが、私にとってはうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.