获取已找到的 WebElement 的“按”定位器

有没有一种优雅的方法来获取我已经发现/识别的硒WebElement的By定位器?

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

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

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

例如,输出为:

[[FirefoxDriver: firefox on WINDOWS (....)] -> id: myPreciousElement]

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

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

然后,您的输出将是:

[[FirefoxDriver: firefox on WINDOWS (....)] -> xpath: //div[@someId = 'someValue']]

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


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

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

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



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

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

答案 1

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

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

考虑以下几点,关于“为什么”。

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

你已经有了对象,所以你不需要调用类似的东西Bye.getBy()


答案 2

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

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
}

推荐