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で尋ねるにはどうすればよいですか?
待機する必要がある場合は、「親」要素とロケーターを取得するpresenceOfNestedElementLocatedBy
メソッドがあります。 By.xpath
:
WebElement subNode = new WebDriverWait(driver,10).until(
ExpectedConditions.presenceOfNestedElementLocatedBy(
divA, By.xpath(".//div/span")
)
);
私も数週間前に同じような立場にありました。また、カスタム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")