44

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" ) )

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

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

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

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

4

5 に答える 5

86

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

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

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

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

XPath仕様は、これについて驚くほどよく読んでいます。

于 2012-05-09T17:44:32.653 に答える
1

すべての ChildNodes を見つけるには、以下のスニペットを使用できます

List<WebElement> childs = MyCurrentWebElement.findElements(By.xpath("./child::*"));

        for (WebElement e  : childs)
        {
            System.out.println(e.getTagName());
        }

これにより、同じレベルのすべての子ノードが提供されることに注意してください->次のような構造がある場合のように:

<Html> 
<body> 
 <div> ---suppose this is current WebElement 
   <a>
   <a>
      <img>
          <a>
      <img>
   <a>

ここでのみ 3 つのアンカー タグのタグ名が表示されます。すべての子要素を再帰的に必要とする場合は、上記のコードを MyCurrentWebElement.findElements(By.xpath(".//*")); に置き換えることができます。

役立つことを願っています!!

于 2015-05-14T19:40:16.290 に答える
0

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

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

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")
于 2012-05-09T18:17:34.087 に答える