回答:
そこにはいくつかのオプションがあります。サンプルコードはJavaですが、他の言語への移植は簡単です。
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
WebElement
注:ご覧のとおり、JavaScriptバージョンにはが必要driver
です。直接アクセスできない場合は、以下WebElement
を使用して取得できます。
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)
する場合、DOMツリーを正しくウォークアップするためにを使用する必要がありますelement.findElement
。コンテキストノードを設定するには、先頭の「./」が必要です。
もう少し XPath axes
以下のHTML
構造があるとしましょう:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
-返す任意の直接の親である要素を。この場合、出力は <div class="parent">
//span/parent::div[@class="parent"]
-戻る親要素のみ正確なノードタイプのとのみ指定された述語が真である場合。出力: <div class="parent">
//span/ancestor::*
- すべての祖先(親を含む)を返します。出力:<div class="parent">
、<nav class="second_level_ancestor">
、<div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- すべての祖先と現在の要素自体を返します。出力:<span>Child</span>
、<div class="parent">
、<nav class="second_level_ancestor">
、<div class="third_level_ancestor">
...
//span/ancestor::div[2]
-タイプの(親から始まる)2番目の祖先を返しますdiv
。出力: <div class="third_level_ancestor">
あなたのDOMを
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
<span>
テキストに基づいて親タグ「a」を選択する必要があるので、次を使用します
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
説明:子ノードの値に基づいてノードを選択してください
div
複数のdivで再びネストされているものを探している場合は.//span
、By.xpath("//div[.//span[text()='Close']]")
を使用する代わりに、*//span
指定されたスパンのほとんどの親div要素を探します。これは次のようになりますdriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
これは他の人にとって役立つかもしれません:このサンプル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
、h2
)と呼ばれますlabelName
。そのラベルの親(つまりdiv class="ParentDiv"
)に移動します。その親の子孫内を検索して、の値を持つ子要素を見つけますelementToSelect
。これによりelementToSelect
、DontSelect
divを親とする2番目は選択されません。
トリックは、最初に親に移動し、次にその親の子孫で必要な要素を検索することにより、要素の検索領域を減らすことができるということです。他のような構文following-sibling::h2
もいくつかのケースで使用できます。これは次の兄弟要素を意味しますh2
。これは、同じ親を持つ同じレベルの要素に対して機能します。
これを行うには、xpathで/ parent :: node()を使用します。/ parent :: node()を子要素のxpathに追加するだけ です。
例:子要素のxpathをchildElementXpathとします。
その場合、直接の祖先のxpathはchildElementXpath / parent :: node()になります。
次の祖先のXpathは、childElementXpath / parent :: node()/ parent :: node()になります。
等々..
また、を使用して要素の祖先に移動することもできます
'childElementXpath/ancestor::*[@attr="attr_value"]'
。これは、一意であるが一意的に識別できない親要素がある既知の子要素がある場合に役立ちます。
次のように、Seleniumを使用して親タグを選択できます。
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
これは、既知のエレメントの祖父母を見つけるのに役立ちます。すぐに親要素を見つけるには、1つ(/ ..)を削除するだけです。
お気に入り:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
これを実装する方法は他にもいくつかありますが、私にとってはうまくいきました。