Selenium 1で選択できる特定の要素があります。
残念ながら、目的の動作を得るには親要素をクリックする必要があります。私が簡単に見つけることができる要素には、選択できない属性があり、クリックできないようになっています。 XPath で上に移動するにはどうすればよいですか?
いくつかのオプションがあります。サンプルコードは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();
XPath axes
についてもう少し
以下のHTML
構造があるとしましょう:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
-直接の親であるany要素を返します。この場合、出力は<div class="parent">
です
//span/parent::div[@class="parent"]
-指定された場合、正確なノードタイプの親要素onlyおよびonlyを返します述語はTrueです。出力:<div class="parent">
//span/ancestor::*
-all祖先(親を含む)を返します。出力:<div class="parent">
、<nav class="second_level_ancestor">
、<div class="third_level_ancestor">
...
//span/ancestor-or-self::*
-all祖先and現在の要素自体を返します。出力:<span>Child</span>
、<div class="parent">
、<nav class="second_level_ancestor">
、<div class="third_level_ancestor">
...
//span/ancestor::div[2]
-div
型の(親から始まる)2番目の祖先を返します。出力:<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']]"));
説明:子ノードの値に基づいてノードを選択します
これは他の誰かにとって有用かもしれません:このサンプル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
という名前のラベル(labelName
、h2
など)を探すことを意味します。そのラベルの親(つまり、div class="ParentDiv"
)に移動します。その親の子孫内を検索して、elementToSelect
の値を持つ子要素を見つけます。これにより、elementToSelect
divを含む2番目のDontSelect
を親として選択しません。
秘Theは、最初に親に移動してから、必要な要素をその親の子孫で検索することにより、要素の検索領域を削減できることです。 following-sibling::h2
などの他の構文も使用できる場合があります。これは、エレメントh2
に続く兄弟を意味します。これは、同じレベルで同じ親を持つ要素に対して機能します。
次のように、Seleniumを使用して親タグを選択できます。
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
これは、既知の要素の祖父母を見つけるのに役立ちます。 1つ(/ ..)を削除して、すぐに親要素を見つけます。
好む:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
これを実装する方法は他にもいくつかありますが、うまくいきました。
これを行うには、xpathで/ parent :: node()を使用します。単に/ parent :: node()を子要素のxpathに追加します。
たとえば、子要素のxpathがchildElementXpathであるとします。
その場合、その直接の祖先のxpathはchildElementXpath/parent :: node()になります。
次の祖先のXpathはchildElementXpath/parent :: node()/ parent :: node()になります
等々..
また、'childElementXpath/ancestor::*[@attr="attr_value"]'
を使用して要素の祖先に移動できます。これは、一意であるが、一意に識別できない親要素を持つ既知の子要素がある場合に役立ちます。