web-dev-qa-db-ja.com

SeleniumでWebElementsの子ノードを見つける

Seleniumを使用してWebアプリケーションをテストしており、By.xpathを使用してタグを見つけることができます。しかし、時々、そのノード内の子ノードを見つける必要があります。

例:

<div id="a">
    <div>
        <span />
        <input />
    </div>
</div>

できます:

WebElement divA = driver.findElement( By.xpath( "//div[@id='a']" ) )

しかし、入力を見つける必要があるので、次のことができます。

driver.findElement( By.xpath( "//div[@id='a']//input" ) )

ただし、コードのその時点では、xpathではなくdivAしかありません...このようなことをしたいと思います。

WebElement input = driver.findElement( divA, By.xpath( "//input" ) );

しかし、そのような機能は存在しません。とにかくこれを行うことはできますか?

ところで:特定のディセンデントノードを持つ<div>を見つける必要がある場合があります。 「<div><span>というテキストが含まれる'hello world'」をxpathで尋ねるにはどうすればよいですか?

41
Steffen Heil

JavaDocs によると、これを行うことができます。

WebElement input = divA.findElement(By.xpath(".//input"));

Xpathで「テキスト「hello world」のスパンを含むdivタグ」を要求するにはどうすればよいですか?

WebElement elem = driver.findElement(By.xpath("//div[span[text()='hello world']]"));

XPath仕様 は、これに関して驚くほど良い読み物です。

75
Petr Janeček

待機する必要がある場合は、「親」要素とロケーターを取得するpresenceOfNestedElementLocatedByメソッドがあります。 By.xpath

WebElement subNode = new WebDriverWait(driver,10).until(
    ExpectedConditions.presenceOfNestedElementLocatedBy(
        divA, By.xpath(".//div/span")
    )
);
2
Matthias Bloch

私も数週間前に同じような立場にありました。また、カスタムElementLocatorFactoryを作成する(または単にdivAをDefaultElementLocatorFactoryに渡す)ことで、これが最初のdivの子であるかどうかを確認することもできます。その後、適切なPageFactory initElementsメソッドを呼び出します。

この場合、次のことを行った場合:

PageFactory.initElements(new DefaultElementLocatorFactory(divA), pageObjectInstance));
// The Page Object instance would then need a WebElement 
// annotated with something like the xpath above or @FindBy(tagName = "input")
0
Scott