【问题标题】:Selenium Element Location硒元素位置
【发布时间】:2012-04-04 20:17:01
【问题描述】:

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

API似乎只有以下方法:

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

有没有一种简单的方法可以做到以下几点:

webElement.findElement(s)(WebElement webElement);

甚至更好:

webElement.contains(WebElement webElement);

【问题讨论】:

  • 我真的不知道你想做什么。你能举个例子吗?据我了解,element.findElement(s)(By by) 应该足以满足您的需求。我做错了什么?
  • 我不希望再次使用反射将 FindBy 注释从字段中拉出。我有两个元素已经使用自定义 PageFactory 进行了初始化。我们有许多不同的模块可以创建并添加到不同的页面。每当在 CMS 中更改页面时,我都不想修改这些测试中的每一个,因此我正在自行定位这些模块,现在我想验证它们是否存在于屏幕上的正确位置(即我想要确保模块 A 位于容器 A 或 B 中,而不是 C)。

标签: java selenium webdriver selenium-webdriver functional-testing


【解决方案1】:

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

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);
}

...仅当这些容器都不重叠时才有效。如果他们这样做了,我会用innerElem.getTag()getText() 尝试一些黑暗和狂野的魔法,并测试外部文本是否包含内部元素。一种方法:

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,正如您已经说过的那样)。

file a bug

【讨论】:

  • 虽然我不一定喜欢这种方法,但它确实提供了好处,因为我们应该能够确定浏览器是否以彼此相似的方式呈现 HTML,但这是一种也是双刃剑,因为 HTML 实际上可能是元素的子元素,但如果我们由于渲染问题而从驱动程序中得到一个软管结果,则不在它的边界内。
  • 是的,我知道这不是我们真正想要的东西 =/。另外,顺便说一句,我编辑了答案,以便对未来的读者更有用(因为你自己看起来很有能力)。
  • 看起来不错,我很可能只使用自定义定位器,因为我认为它会更干净一些。我还将将此作为功能请求发布在 selenium google 代码存储库中。
  • 或者那个。有趣的是,我根本没有考虑过这一点
  • 如果您好奇,我将父元素传递给我们创建的自定义 ElementLocatorFactory,如果在该特定 WebElement 中找不到异常,则捕获异常(并提交问题 3682)。
猜你喜欢
  • 2020-07-23
  • 2019-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多