簡單的案例
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.chrome.ChromeOptions;
public class seleniumWait {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
ChromeOptions options = new ChromeOptions();
// options.addArguments("--headless"); // 如果不需要瀏覽器窗口,可以加上這行
WebDriver driver = new ChromeDriver(options);
// 1.打開百度搜索
driver.get("https://www.baidu.com/");
// 2.定位搜索框
WebElement input = driver.findElement(By.name("wd"));
// 3。在搜索框輸入對應信息
input.sendKeys("開思通智網");
//點擊百度一下
driver.findElement(By.id("su")).click();
}
}
1. 隱式等待(Implicit Wait)
概念:
隱式等待是告訴 WebDriver 等待一定的時間,如果在這段時間內元素仍然無法找到,則拋出 NoSuchElementException。隱式等待在設置之後會在整個 WebDriver 實例的生命週期內起作用。
使用場景:
隱式等待適用於希望 WebDriver 在尋找任何元素時都等待一段時間。這種等待機制不需要頻繁設置,可以用於處理網絡延遲或加載較慢的頁面。
代碼表示
driver.manage.timeouts.implicitlyWait(long time, TimeUtil unit);
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class ImplicitWaitExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
// 設置隱式等待時間為10秒
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://example.com");
// 嘗試查找元素
WebElement element = driver.findElement(By.id("elementId"));
// 你的測試代碼
driver.quit();
}
}
2. 顯式等待(Explicit Wait)
概念:
顯式等待用於在指定的條件下等待特定元素。WebDriverWait 和 ExpectedConditions 是顯式等待的兩個主要組成部分。WebDriverWait 在設定的超時時間內每隔一段時間檢查一次條件是否滿足,如果條件在超時時間內未滿足,則拋出 TimeoutException。
使用場景:
顯式等待適用於需要等待特定條件(如元素可見、元素可點擊等)的場景。與隱式等待相比,顯式等待更為靈活和精確。
代碼示例:
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.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class ExplicitWaitExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
// 設置顯式等待
WebDriverWait wait = new WebDriverWait(driver, 10);
// 等待元素可見
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));
// 你的測試代碼
driver.quit();
}
}
常用預定義條件
- visibilityOfElementLocated(By locator): 等待元素可見
- elementToBeClickable(By locator): 等待元素可點擊
- presenceOfElementLocated(By locator): 等待元素存在於DOM中
- titleContains(String title): 等待頁面標題包含特定字符串
-
urlContains(String fraction): 等待URL包含特定字符串
使用步驟
- 創建WebDriverWait對象,設定最長等待時間。
- 使用ExpectedConditions定義具體的等待條件。
- 使用until方法將等待條件傳遞給WebDriverWait對象。
3. Fluent 等待(Fluent Wait)
概念:
Fluent 等待是顯式等待的增強版,允許用户定義等待的頻率和忽略的異常類型。它提供更高的靈活性,可以在等待過程中每隔一段時間檢查一次條件。
使用場景:
Fluent 等待適用於需要在等待過程中進行多次檢查的複雜場景,例如等待頁面動態內容加載。
代碼示例:
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.FluentWait;
import java.time.Duration;
import java.util.NoSuchElementException;
import java.util.function.Function;
public class FluentWaitExample {
public static void main(String[] args) {
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
// 設置 Fluent 等待
FluentWait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(10)) // 最大等待時間
.pollingEvery(Duration.ofSeconds(1)) // 每隔1秒檢查一次
.ignoring(NoSuchElementException.class); // 忽略 NoSuchElementException
// 等待元素出現
WebElement element = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("elementId"));
}
});
// 你的測試代碼
driver.quit();
}
}
4. 線程睡眠(Thread.sleep)
概念:
線程睡眠是強制暫停當前線程執行一段時間。雖然簡單易用,但不推薦在自動化測試中頻繁使用,因為它會使測試變得不穩定和緩慢。
使用場景:
線程睡眠僅在調試或其他等待機制無法滿足需求的情況下使用。
代碼示例:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ThreadSleepExample {
public static void main(String[] args) throws InterruptedException {
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
// 強制等待5秒
Thread.sleep(5000);
// 你的測試代碼
driver.quit();
}
}
總結
隱式等待:適用於全局等待,簡化代碼,但不適合特定條件。
顯式等待:靈活且精確,適用於特定條件的等待。
Fluent 等待:增強版顯式等待,適用於複雜場景。
線程睡眠:簡單但不推薦,僅在特殊情況下使用。
轉載自開思通智網:https://w3.opensnn.com/os/article/10001329