Java 从WebElement代理获取定位器

Java 从WebElement代理获取定位器,java,selenium,appium,Java,Selenium,Appium,是否有方法获取在Java中查找WebElement失败时使用的By定位器?什么 我试图做的是,在捕捉到NoSuchElementException的时候,在我再次尝试查找元素之前查看并更改它(从id更改为xpath)。我使用的是页面工厂模式和@FindBy(id=xxx)——我知道在找到WebElement之前,我会使用它作为代理对象。 从Eclipse中未找到元素后断点处的调试视图中,我可以看到By locator信息,但在代码中我无法提取它。这里是等待的方法,它将根据元素在轮询时间内是否存在

是否有方法获取在Java中查找WebElement失败时使用的By定位器?什么

我试图做的是,在捕捉到
NoSuchElementException
的时候,在我再次尝试查找元素之前查看并更改它(从id更改为xpath)。我使用的是页面工厂模式和
@FindBy(id=xxx)
——我知道在找到WebElement之前,我会使用它作为代理对象。
从Eclipse中未找到元素后断点处的调试视图中,我可以看到By locator信息,但在代码中我无法提取它。

这里是等待的方法,它将根据元素在轮询时间内是否存在(例如10秒)返回true/或false;值得注意的是,如果发现元素早于10秒限制,循环将中断并返回true。当然你可以通过超时来达到想要的效果;但不要太快(比如2秒),否则您可能会冒测试偶尔失败的风险,因为表尚未加载:

public boolean waitForElement(String elementXpath, int timeOut) {

try{                    
WebDriverWait wait = new WebDriverWait(driver, timeOut); 
boolean elementPresent=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(elementXpath)).isDisplayed());

System.out.printf("%nElement is present [T/F]..? ")+elementPresent;
}        
catch(TimeoutException e1){e1.printStackTrace();elementPresent=false;}          

    return elementPresent;   
 }

你所说的更改“按定位器”是什么意思,这是一个非常愚蠢的方法。这行不通。与其说什么不起作用,不如说你能解释一下你试图实现什么,你的实际问题。我认为当他得到一个NoTouchElementException时,他会尝试重新找到元素。MikeG请阅读关于隐式/显式的内容,等等,如果元素在一段时间后不存在,那么它就不存在了!原因是我们已有SeleniumWeb自动化,它使用ID和XPath查找所有元素。我们正在为我们的移动客户端(使用Appium)重用这些代码(测试、页面和UTIL),因为客户端是使用Ionic框架创建的,因此本质上是包装在移动应用中的web客户端。然而,我们的Ionic框架和WebView存在某些问题,这意味着我只需要使用xpath来查找元素。因此,为了避免更改所有现有的页面类,我希望在waitForElement/doesElementExist方法中使用ID并更改为xpath。