1. 程式人生 > >Selenium常用的三種等待方式

Selenium常用的三種等待方式

Selenium Selenium等待 UI自動化 Selenium三種等待方式

等待

在做自動化測試,設計測試用例的時候,有時下一步的操作會依賴上一步的結果或者內容,上一步操作成功之後才能進行下一步操作等,這時候,我們就需要使用等待,來判斷上一步操作是否完成,什麽時候可以進行下一步操作。
如果說上一步操作如果花費的時間較長,還沒有完成,就去進行下一步操作,這時就會產生無法定位到對象,對象狀態不正確,數據校驗結果不正確等異常情況。
最後總結:等待可以提高UI自動化代碼的穩定性,讓代碼能夠

固定等待
固定等待是腳本中比較常見的一種等待方式,它是利用線程的原理將整個線程後面的代碼延遲執行。這種等待可以說比較的霸道,屬於強制性等待,目前它是使用最簡單的一種辦法,強制讓瀏覽器等待X秒,不管當前操作是否完成,是否可以進行下一步操作,都必須等X秒的時間。

缺點:不能準確把握需要等待的時間(有時操作還未完成,等待就結束了,導致報錯;有時操作已經完成了,但等待時間還沒有到,浪費時間),如果在用例中大量使用,會浪費不必要的等待時間,影響測試用例的執行效率。
優點:使用簡單,可以在調試時使用。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class sleep {

public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
    String chromePath=System.getProperty("user.dir")
            +"\\driver\\chromedriver.exe";
    System.setProperty("webdriver.chrome.driver", chromePath);
    WebDriver driver=new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("https://www.baidu.com");
        /*
         * 強制等待5秒
         */
Thread.sleep(5000);

    driver.get("https://www.jd.com");
    }

}

註意:Thread.sleep(int);方法是以毫秒為計量單位的;

隱藏式等待
隱藏式等待是指設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然後執行下一步操作。
缺點:使用隱式等待,程序會一直等待整個頁面加載完成,才會執行下一步操作;但有時候頁面想要的對象早已經加載完成了,但是因為網頁上個別對象還沒有加載完成,仍要等到頁面全部完成才能執行下一步,使用也不是很靈活。
優點:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
方法:driver.manage().timeouts().implicitlyWait(int, TimeUnit.SECONDS);

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class hiedWait {

public static void main(String[] args) {
        // TODO Auto-generated method stub
String chromePath=System.getProperty("user.dir")
                +"\\driver\\chromedriver.exe";
    System.setProperty("webdriver.chrome.driver", chromePath);
    WebDriver driver=new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("https://www.baidu.com");
        /*
         * 隱藏式等待5秒
         */
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

}

}

顯式等待
配合until或者until_not方法,再輔助以一些判斷條件,就可以構成這樣一個場景:每經過多少秒就查看一次locator的對象是否可見,如果可見就停止等待,如果不可見就繼續等待直到超過規定的時間後,報超時異常;當然也可以判斷某對象是否在規定時間內不可見等等的各種場景吧,需要根據你自己實際的場景選擇判斷條件;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class showWait {

public static void main(String[] args) {
        // TODO Auto-generated method stub
String chromePath=System.getProperty("user.dir")
        +"\\driver\\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", chromePath);
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
WebDriverWait wait=new WebDriverWait(driver, 10);
        /*
         * 通過WebDriverWait對象實現,每500毫秒掃描界面是否出現“新聞”對象,未發現的話等待10秒(計算從開始掃描到結束時間)
         */
WebElement wl = wait.until(new ExpectedCondition<WebElement>() {  
public WebElement apply(WebDriver d) {  
    return d.findElement(By.linkText("新聞"));  
            }  
    });

}

}

Selenium常用的三種等待方式