1. 程式人生 > >Appium 等待的三種方法

Appium 等待的三種方法


1.sleep  eg: Thread.sleep(60000);強制等待60s
2.implicitlyWait
  driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
  //隱式等待,全域性等待30s不管是否已經載入
3.WebDriverWait 顯示等待,這個需要增加一定等待時間,顯示等待時間可以通過WebDriverWait 和util來決定
 WebDriverWait wait=new WebDriverWait(driver,60);
  WebElement e=wait.until(new ExpectedCondition<WebElement>(){
  @Override
  public WebElement apply(WebDriver d){
  return d.findElement(By.id("q"));
  }
  })
  只用WebDriverWait是selenium所特有,在java-client中也找不到相應,如果想使用這種方法怎麼辦?


改造輪子,首先新增AndroidDriverWait.java, 其實是將WebDriverWait的型別改成AndroidDriverWait


具體程式碼如下:
第一步:建立AndroidDriverWait.java, 其實是將WebDriverWait的型別改成AndroidDriverWait
import java.util.concurrent.TimeUnit;


import io.appium.java_client.android.AndroidDriver;


import org.openqa.selenium.NotFoundException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.SystemClock;
import org.openqa.selenium.support.ui.Clock;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Sleeper;






public class AndroidDriverWait extends FluentWait<AndroidDriver>{
public final static long DEFAULT_SLEEP_TIMEOUT=500;
private final WebDriver driver;
public AndroidDriverWait(AndroidDriver driver,long timeOutInSeconds){
this(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, DEFAULT_SLEEP_TIMEOUT);
}
public AndroidDriverWait(AndroidDriver driver,long timeOutInSeconds,long sleepInMillis){
this(driver, new SystemClock(), Sleeper.SYSTEM_SLEEPER, timeOutInSeconds, sleepInMillis);
}

public AndroidDriverWait(AndroidDriver driver,Clock clock,Sleeper sleeper,long timeOutInSeconds,long sleepTimeOut){
super(driver,clock,sleeper);
withTimeout(timeOutInSeconds,TimeUnit.SECONDS);
pollingEvery(sleepTimeOut,TimeUnit.MILLISECONDS);
ignoring(NotFoundException.class);
this.driver=driver;
}
  @Override
  protected RuntimeException timeoutException(String message,Throwable lastException){
 TimeoutException ex=new TimeoutException(message,lastException);
 ex.addInfo(WebDriverException.DRIVER_INFO,driver.getClass().getName());
 if(driver instanceof RemoteWebDriver){
 RemoteWebDriver remote=(RemoteWebDriver) driver;
 if(remote.getSessionId()!=null){
 ex.addInfo(WebDriverException.SESSION_ID,remote.getSessionId().toString());
 }
 if(remote.getCapabilities()!=null){
 ex.addInfo("Capabilities",remote.getCapabilities().toString());
 }
 }
 throw ex;
  }
   
}


第二步:接著需要修改介面:ExpectedCondition,將其WebDriver的型別替換為AndroidDriver


   import com.google.common.base.Function;
   import io.appium.java_client.android.AndroidDriver;
   public interface ExpectedCondition<T> extends Function<AndroidDriver,T>
   {}
第三步:經過第一二步後,就可以在appium 中直接使用;
       WebElement showClose=new AndroidDriveWait(driver,60).until(new ExpectedCondition<WebElement>(){
       public WebElement apply(AndroidDriver d){
       return d.findElemnt(By.id("com.zhihu.android:id/showcase_close"));


       }
       });