Appium 等待的三種方法
阿新 • • 發佈:2019-02-10
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"));
}
});