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

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

要清楚这个问题:我想要用“定位器”来查找元素。 在这种情况下,我对特定属性或特定定位器(如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’]]

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

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

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

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

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

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

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

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

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

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

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

我将来可能会实现这样的东西,但没有承诺。 再次 – 它只是糖。

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

 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 } 

对我来说,与commons-lang3合作

  org.apache.commons commons-lang3 3.7  

对于远程Web元素使用方法,如:

 protected String getLocator(WebElement element) { try { Object proxyOrigin = FieldUtils.readField(element, "h", true); Object locator = FieldUtils.readField(proxyOrigin, "locator", true); Object findBy = FieldUtils.readField(locator, "by", true); if (findBy != null) { return findBy.toString(); } } catch (IllegalAccessException ignored) { } return "[unknown]"; }