博客 / 詳情

返回

selenium-java等待方式

簡單的案例

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

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.