Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cuộn trang (Scroll Down) với Selenium WebDriver Java bằng JavascriptExecutor

Selenium WebDriver không hỗ trợ trực tiếp thao tác cuộn trang. Giải pháp phổ biến là sử dụng JavascriptExecutor để thực thi lệnh JavaScript scrollIntoView().

Cú pháp cơ bản

WebElement element = driver.findElement(By.locator("..."));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
  • arguments[0] là element truyền vào.
  • true: cuộn để element hiển thị ở đầu viewport (top). false: ở cuối (bottom).

Ví dụ hoàn chỉnh

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ScrollExample {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.example.com/long-page");

        try {
            // Tìm element cần cuộn tới
            WebElement target = driver.findElement(By.xpath("//*[text()='Contact']"));
            
            // Cuộn tới element
            ((JavascriptExecutor) driver).executeScript(
                "arguments[0].scrollIntoView(true);", target);
            
            // Có thể thêm wait nhỏ để UI ổn định
            Thread.sleep(500);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.quit();
        }
    }
}

Các biến thể hữu ích

Mục đíchJavaScript
Cuộn đến element (căn top)arguments[0].scrollIntoView(true)
Cuộn đến element (căn bottom)arguments[0].scrollIntoView(false)
Cuộn xuống dưới một khoảng cố địnhwindow.scrollBy(0, 500)
Cuộn về đầu trangwindow.scrollTo(0, 0)
Cuộn đến tọa độ (x, y)window.scrollTo(x, y)

Lưu ý quan trọng

  • Luôn ép kiểu driver sang JavascriptExecutor trước khi gọi executeScript.
  • Element phải tồn tại trong DOM (có thể dùng WebDriverWait để chờ).
  • Tránh dùng Thread.sleep cứng; hãy dùng WebDriverWait kết hợp ExpectedConditions.
  • Với lazy-loading content, có thể cần cuộn nhiều lần để tải hết dữ liệu.