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

drk*_*hng 22 java selenium pageobjects selenium-webdriver

是否有一种优雅的方式来获取Selenium WebElement的By定位器,我已经找到/识别出来了?

要清楚这个问题:我想要用"定位器"来查找元素.在这种情况下,我对特定属性或特定定位器(如css-locator)不感兴趣.

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

WebElement element = driver.findElement(By.id("myPreciousElement"));
System.out.println(element.toString());
Run Code Online (Sandbox Code Playgroud)

输出将是例如:

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

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

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

然后你的输出将是:

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

所以我目前编写了自己的方法来解析这个输出并给我"重新创建"By Locator.


但是有没有一种更优雅的方式已经在Selenium中实现,以获取用于查找元素的By定位器?

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

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



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

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

dda*_*son 5

答案是否定的.By默认情况下,您无法从以前找到的WebElement中提取.

话虽这么说 - 它可以实现自定义解决方案,但Selenium不提供这种开箱即用的解决方案.

考虑以下内容,关于"为什么"..

By by = By.id("someId");
WebElement e = driver.findElement(by);
Run Code Online (Sandbox Code Playgroud)

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

我可能会在未来实施类似的东西,但没有承诺.再说一次 - 它只是糖.

  • 但是对于PageObject和PageFactory模式,`By`定义在注解中,元素本身无法知道`By` (4认同)

Zym*_*mus 5

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

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
}
Run Code Online (Sandbox Code Playgroud)