appnium顯式等待機制
強制等待: sleep不推薦全域性隱式等待
全域性隱式等待:
在服務端等待
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
顯式等待
在客戶端等待
new WebDriverWait(driver).until(ExpectedConditions.visibilityOfElementLocated(By.xpath(").action;
◆顯示等待與隱式等待相對,顯示等待必須在每個需要等待的元素前面進行宣告
◆是針對於某個特定的元素設定的等待時間,在設定時間內,預設每隔段時 間檢測一次當前頁面某個元素是否存在,
◆如果在規定的時間內找到了元素,則直接執行,即找到元素就執行相關操作
◆如果超過設定時間檢測不到則丟擲異常。預設檢測頻率為0.5s,預設丟擲異常為:NoSuchElementException
◆顯示等待用到的兩個類:
◆WebDriverWait和ExpectedConditions兩個類
◆顯式等待可以等待動態載入的ajax元素,顯式等待需要使ExpectedCondtions來檢查條件
◆一般驗證頁面上元素的呈現
◆title出現首先出現title
◆dom樹出現presence ,還不完整
◆Css出現(可見visibility)
◆js出現,js特效執行( 可點選clickable)
◆html文件是自上而下載入的,
◆js檔案載入會阻塞Html內容的載入,有些JS非同步載入的方式來完成js的載入
◆樣式表下載完成之後會跟之前的樣式表一 起進行解析,會對之前的元素重新渲染
webDriverWait的用法
wait= new WebDriverWait(driver,10 ,1000);
timeOutInSeconds:最長超時時間,預設以秒為單位
sleepInMills :檢測的間隔步長,預設0.5S
WebDriverWait(driver,120) .until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text='通訊錄']")));
ExpectedConditions類:
presenceOfElementLocated判斷元素是否被加到了DOM裡,並不代表該元素一定可見
用法:
waituntil(ExpectedConditions.presenceOfElementLocated(By.id("home_ search));
visibilityOfElementLocated判斷某個元素是否可見,可見代表元素非隱藏,並且元素的寬
和高都不等於0
用法
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("home_ search"));
@Test
@DisplayName("測試名稱:隱式等待")
public void waityinshi() throws InterruptedException {
wait=new WebDriverWait(driver,10,1000);
//隱式等待 點選搜尋後等待10s
driver.findElement(By.id("com.xueqiu.amdroid:id/home_search")).click();
driver.findElement(By.id("com.xueqiu.android:id/search_input_text")).sendKeys("阿里巴巴");
WebElement element= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@text=BABA]")));
System.out.println(element.getAttribute("enable"));
element.click();
總結三種等待方式:
隱式等待,儘量預設都加上,時間限定在3-6s,不要太長,為了所有的find_ element方 法都有一一個很好的緩衝
顯式等待,用來處理隱式等待無法解決的一些問題,比如:檔案上傳(可以設定長一點),檔案上傳需要設定20s以上,但是如果設定隱式等待,它會在每個find方檔案上傳需要設定20s以上,
但是如果設定隱式等待,它會在每個find方法都等這麼長時間,一旦發現沒有找到元素,就會等20s以後才丟擲異常,影響case的執行效率,這時候就需要用顯式等待
強制等待: 一般不推薦,前兩種基本能解決絕大部分問題,如果某個控制元件沒有任何特徵,只能強制等待,這種情況比較少