Java 硒元素定位

Java 硒元素定位,java,selenium,webdriver,selenium-webdriver,functional-testing,Java,Selenium,Webdriver,Selenium Webdriver,Functional Testing,有没有一种简单的方法可以从另一个元素中找到子元素(这两个项都是使用PageFactory定位的)?我们有一组容器,其中包含许多模块,我希望确保它们显示在正确的位置 API似乎只有以下方法: webElement.findElement(s).(By by); 是否有一种简单的方法来执行以下操作: webElement.findElement(s)(WebElement webElement); 或者更好: webElement.contains(WebElement webElement);

有没有一种简单的方法可以从另一个元素中找到子元素(这两个项都是使用PageFactory定位的)?我们有一组容器,其中包含许多模块,我希望确保它们显示在正确的位置

API似乎只有以下方法:

webElement.findElement(s).(By by);
是否有一种简单的方法来执行以下操作:

webElement.findElement(s)(WebElement webElement);
或者更好:

webElement.contains(WebElement webElement);

我终于得到了你需要的东西。我的最佳解决方案是:

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);
}
…或类似的东西。由于标签中的标签在标签中,可能需要或(或两者兼有)

当然,这仍然是猜测。第一种方法可能有误报和漏报(但考虑到我的需要,我更喜欢它),第二种方法应该只有误报。您可以将它们结合起来,或者自己发明一些东西(例如,使用您已经说过的
反射


或者。

我真的搞不懂你想干什么。你能举个例子吗?据我所知,
元素.findElement(By)
应该足以满足您的需要。我做错了什么?我不希望再次利用反射将FindBy注释从字段中移除。我有两个元素已经用自定义PageFactory初始化。我们有许多不同的模块,可以创建并添加到不同的页面。我不想在CMS中更改页面时修改这些测试中的每一个,因为我正在自行定位这些模块,现在我想验证它们是否存在于屏幕上的正确位置(即,我想确保模块A位于容器A或B中,但不在容器C中)。虽然我不一定喜欢这种方法,它确实提供了好处,因为我们应该能够确定浏览器是否以相似的方式呈现HTML,但是这也是一把双刃剑,因为HTML实际上可能是元素的子元素,但如果我们由于呈现问题从驱动程序得到一个hosed结果,则不在它的边界之内。是的,我知道这不是我们真正想要的东西。另外,我编辑了答案,以便对未来的读者更有用(因为你自己似乎也很有能力)。看起来不错,我很可能只是去做一个自定义定位器,因为我认为它会更干净一些。我还打算将此作为功能请求发布在selenium google代码库中。有趣的是,我一点也没想过。如果你好奇的话,我将父元素传递给了我们创建的自定义ElementLocatorFactory,如果在特定的WebElement中找不到异常,我会捕获异常(并提交了第3682期)。
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
}