#574 FIX by TikhomirovSergey · Pull Request #582 · appium/java-client
the toString() method is invoked. And this method is overriden by RemoteWebElement. So the searching was being invoked... twice :)))
package io.appium.java_client.pagefactory_tests; import io.appium.java_client.android.BaseAndroidTest; import io.appium.java_client.pagefactory.AndroidFindBy; import io.appium.java_client.pagefactory.AppiumFieldDecorator; import io.appium.java_client.pagefactory.WithTimeout; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.util.Calendar; import java.util.concurrent.TimeUnit; import static org.junit.Assert.assertTrue; public class BugReproducing extends BaseAndroidTest { private static final long ACCEPTABLE_DELTA_MILLS = 1500; @WithTimeout(time = 4, unit = TimeUnit.SECONDS) @AndroidFindBy(className = "ABC") //this is invalid locator; purposely put up private WebElement textView; /** * The setting up. */ @Before public void setUp() throws Exception { PageFactory.initElements(new AppiumFieldDecorator(driver, 15, TimeUnit.SECONDS), this); } public boolean isElementPresent(WebElement elementName, int timeout){ try{ WebDriverWait wait = new WebDriverWait(driver, timeout); wait.until(ExpectedConditions.visibilityOf(elementName)); return true; }catch(Exception e){ return false; } } private static boolean checkTimeDifference(long expectedTime, TimeUnit expectedTimeUnit, long currentMillis) { long expectedMillis = TimeUnit.MILLISECONDS.convert(expectedTime, expectedTimeUnit); try { Assert.assertEquals(true, ((currentMillis - expectedMillis) < ACCEPTABLE_DELTA_MILLS) && ( (currentMillis - expectedMillis) >= 0)); } catch (Error e) { String message = String.valueOf(expectedTime) + " " + expectedTimeUnit.toString() + " current duration in millis " + String.valueOf(currentMillis) + " Failed"; throw new AssertionError(message, e); } return true; } @Test public void findByElementTest() { long startMark = Calendar.getInstance().getTimeInMillis(); isElementPresent(textView,2); /*try { textView.isDisplayed(); } catch (Exception e) { e.printStackTrace(); }*/ long endMark = Calendar.getInstance().getTimeInMillis(); assertTrue(checkTimeDifference(4, TimeUnit.SECONDS, endMark - startMark)); } }