2

別の要素から子要素を見つける簡単な方法はありますか(これらのアイテムは両方ともPageFactoryを使用して検索されています)?多くのモジュールを保持するコンテナのセットがあり、それらが適切な場所に表示されていることを確認したいと思います。

APIには次のメソッドしかないようです。

webElement.findElement(s).(By by);

次のことを行う簡単な方法はありますか?

webElement.findElement(s)(WebElement webElement);

またはさらに良い:

webElement.contains(WebElement webElement);
4

1 に答える 1

2

私はついにあなたが必要とするものを手に入れました。私の最善の解決策は、次のようなものです。

public static void assertContains(WebElement outerElem, WebElement innerElem) {
    // get borders of outer element
    Point outerLoc = outerElem.getLocation();
    Dimension outerDim = outerElem.getSize();
    int outerLeftX = outerLoc.getX();
    int outerRightX = outerLeftX + outerDim.getWidth();
    int outerTopY = outerLoc.getY();
    int outerBottomY = outerTopY + outerDim.getHeight();

    // get borders of inner element
    Point innerLoc = innerElem.getLocation();
    Dimension innerDim = innerElem.getSize();
    int innerLeftX = innerLoc.getX();
    int innerRightX = innerLeftX + innerDim.getWidth();
    int innerTopY = innerLoc.getY();
    int innerBottomY = innerTopY + innerDim.getHeight();

    // assures the inner borders don't cross the outer borders
    final String errorMsg = "ughh, some error message";
    final boolean contains = (outerLeftX <= innerLeftX)
            && (innerRightX <= outerRightX)
            && (outerTopY <= innerTopY)
            && (innerBottomY <= outerBottomY);
    assertTrue(errorMsg, contains);
}

...これらのコンテナーが重複しない場合にのみ機能します。もしそうなら、and を使ってダークでワイルドな魔法をinnerElem.getTag()試しgetText()、外側のテキストに内側の要素が含まれているかどうかをテストします。それを行う1つの方法:

public static void assertContains(WebElement outer, WebElement inner) {
    // e.g. //div[text()='some text in inner element']
    final String findInner = ".//" + inner.getTagName() + "[text()='" + inner.getText() + "']";
    try {
        outerElem.findElement(By.xpath(findInner));
    } catch (NoSuchElementException ignored) {
        fail("Some horrible message! We are all doomed!");
    }
    // passed
}

...または似たようなもの。タグインタグインタグ イン...

そしてもちろん、これはまだ推測です。最初の方法には偽陽性と偽陰性がある可能性があります (ただし、私のニーズを考えると、この方法の方が気に入っています)。それらを組み合わせたり、自分で何かを発明したりできます(たとえば、Reflectionすでに述べたように使用します)。

または、バグを報告します。

于 2012-04-04T21:35:11.400 に答える