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 đích | JavaScript |
|---|---|
| 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ố định | window.scrollBy(0, 500) |
| Cuộn về đầu trang | window.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
JavascriptExecutortrước khi gọiexecuteScript. - Element phải tồn tại trong DOM (có thể dùng
WebDriverWaitđể chờ). - Tránh dùng
Thread.sleepcứng; hãy dùngWebDriverWaitkết hợpExpectedConditions. - Với lazy-loading content, có thể cần cuộn nhiều lần để tải hết dữ liệu.