web-dev-qa-db-ja.com

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

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

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

94
f l

いくつかのオプションがあります。サンプルコードは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();
143
acdcjunior

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::*-直接の親であるany要素を返します。

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

  1. //span/parent::div[@class="parent"]-指定された場合、正確なノードタイプの親要素onlyおよびonlyを返します述語はTrueです。

出力:<div class="parent">

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

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

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

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

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

出力:<div class="third_level_ancestor">

25
Andersson

DOMを次のように考えてみましょう

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

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

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

説明:子ノードの値に基づいてノードを選択します

14
Bhuvanesh Mani

考えられる XPath軸 を見てください。おそらくparentを探しています。最初の要素を見つける方法に応じて、そのためにxpathを調整することができます。

あるいは、現在のノードの親を選択する 二重ドット構文..を試すこともできます。

14
prestomanifesto

これは他の誰かにとって有用かもしれません:このサンプル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'] 

これは、aという名前のラベル(labelNameh2など)を探すことを意味します。そのラベルの親(つまり、div class="ParentDiv")に移動します。その親の子孫内を検索して、elementToSelectの値を持つ子要素を見つけます。これにより、elementToSelect divを含む2番目のDontSelectを親として選択しません。

秘Theは、最初に親に移動してから、必要な要素をその親の子孫で検索することにより、要素の検索領域を削減できることです。 following-sibling::h2などの他の構文も使用できる場合があります。これは、エレメントh2に続く兄弟を意味します。これは、同じレベルで同じ親を持つ要素に対して機能します。

4
papigee

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

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

これは、既知の要素の祖父母を見つけるのに役立ちます。 1つ(/ ..)を削除して、すぐに親要素を見つけます。

好む:

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

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

0
Utsav Jain

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

たとえば、子要素のxpathがchildElementXpathであるとします。

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

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

等々..

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

0
Johnes Jose