获取已找到的 WebElement 的 By 定位器

新手上路,请多包涵

有没有一种优雅的方法来获取我已经找到/识别的 Selenium WebElement 的定位器?

要明确这个问题:我想要用于查找元素的“按定位器”。在这种情况下,我对特定属性或特定定位器(如 css-locator) 感兴趣。

我知道我可以解析 WebElement 的 toString() 方法的结果:

 WebElement element = driver.findElement(By.id("myPreciousElement"));
System.out.println(element.toString());

输出将是例如:

[[FirefoxDriver: WINDOWS 上的 firefox (….)] -> id: myPreciousElement]

如果你通过 xpath 找到你的元素:

 WebElement element = driver.findElement(By.xpath("//div[@someId = 'someValue']"));
System.out.println(element.toString());

那么你的输出将是:

[[FirefoxDriver: WINDOWS 上的 firefox (….)] -> xpath: //div[@someId = ‘someValue’]]

因此,我目前编写了自己的方法来解析此输出并为我提供“重新创建”的定位器。

但是 是否已经在 Selenium 中实现了一种更优雅的方法来获取用于查找元素的 By 定位器?

到目前为止我找不到一个。

如果您确定没有开箱即用的功能,您能想到 API 创建者可能不提供此功能的任何原因吗?

*尽管这与问题无关,但如果有人想知道您为什么需要此功能,请举两个例子:

  • 如果您使用 PageFactory,您很可能不会将定位器作为 Page 类中的成员变量,但稍后在处理页面元素时可能需要它们。
  • 你正在与那些只使用没有 PageFactory 的页面对象模式的人的 API 一起工作,因此希望你交出定位器而不是元素本身。*

原文由 drkthng 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 562
2 个回答

tldr;不是默认的,不。您不能从以前找到的 WebElement 中提取 By 。但是,可以通过自定义解决方案。

可以实现自定义解决方案,但 Selenium 不提供这种开箱即用的解决方案。

考虑以下关于“为什么”的问题……

 By by = By.id("someId");
WebElement e = driver.findElement(by);

你已经有了 By 对象,所以你不需要调用类似 e.getBy()

原文由 ddavison 发布,翻译遵循 CC BY-SA 4.0 许可协议

不,没有。我已经实施了一个可能的解决方案作为代理:

 public class RefreshableWebElement implements WebElement {

    public RefreshableWebElement(Driver driver, By by) {
        this.driver = driver;
        this.by = by;
    }

    // ...

    public WebElement getElement() {
        return driver.findElement(by);
    }

    public void click() {
        getElement().click();
    }

    // other methods here
}

原文由 Zymus 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题