使用@FindBy定位MobileElement配合WebDriverWait出现无限NoSuchElementError怎么办
Appium @FindBy元素等待卡死问题解决方案
问题根源
使用@FindBy注解声明的MobileElement属于代理对象,只有调用元素实例方法时才会触发真实的移动端元素查找逻辑。原生ExpectedConditions.visibilityOf(元素)方法执行时会优先获取元素实例,若此时元素不存在,代理会直接抛出NoSuchElementError,不会触发显式等待的超时逻辑,同时你原代码中超时参数配置错误,共同导致了运行时卡死、无限抛错的问题。
解决代码
无需切换为By定位器,自定义适配MobileElement的等待条件即可实现需求:
@FindBy(id = "tv_error_card") MobileElement NID_Card_Error; // WebDriverWait第二个参数默认单位为秒,此处设置5秒超时,请勿传入5000 WebDriverWait wait = new WebDriverWait(driver, 5); try { // 自定义等待条件,主动捕获元素查找异常 wait.until(driver -> { try { return NID_Card_Error.isDisplayed(); } catch (NoSuchElementException | StaleElementReferenceException e) { // 元素不存在/失效时返回false,继续等待 return false; } }); } catch (TimeoutException e) { // 超时后执行自定义报错逻辑 System.out.println("time expired"); assertTrue("element messing ", false); }
适配低版本JDK写法
如果使用JDK8以下版本,替换Lambda表达式为匿名内部类即可:
wait.until(new ExpectedCondition<Boolean>() { @Override public Boolean apply(WebDriver driver) { try { return NID_Card_Error.isDisplayed(); } catch (NoSuchElementException | StaleElementReferenceException e) { return false; } } });
内容的提问来源于stack exchange,提问作者hussam
相关产品推荐
相关产品推荐

