Java selenium操作下拉滚动条的几种方法

简介: 数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法我这里演示的是Java版本的,使用chromedriver,当然你可以换成python或其他语言,浏览器用firefox或者phantomjs(无头浏览器),大部分都是适用的,不同浏览器有略微的差异。

数据采集中,经常遇到动态加载的数据,我们经常使用selenium模拟浏览器操作,需要多次下拉刷新页面才能采集到所有的数据,就此总结了几种selenium操作下拉滚动条的几种方法
我这里演示的是Java版本的,使用chromedriver,当然你可以换成python或其他语言,浏览器用firefox或者phantomjs(无头浏览器),大部分都是适用的,不同浏览器有略微的差异。

初始化一个浏览器

首先要允许浏览器运行js脚本

DesiredCapabilities sCaps = new DesiredCapabilities();
sCaps.setJavascriptEnabled(true);
System.getProperties().setProperty("webdriver.chrome.driver", "D:/tool/chromedriver.exe");
WebDriver webDriver  = new ChromeDriver(sCaps);

1.直接操作页面

#下拉到页面底部
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,document.body.scrollHeight)");
#上拉到页面顶端
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(document.body.scrollHeight,0)");

或:

#下拉到页面1000位置
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,1000)");
#上拉到页面顶端 0,0位置
((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,0)");

### 2.拖动到页面元素位置

经过测试这种方式最靠谱,在Chrome和phantomjs都测试通过,而其他方式有些网站在Chrome中没问题,但到了phantomjs中就有问题了,页面根本不动。
不过这几种方式对大部分网站应该还是都可以的。

比如要把页面拖动到id为test的元素位置,当然findElement方法还支持xpath和css选择器等多种方式

String script = "return arguments[0].scrollIntoView();";
WebElement element = webDriver.findElement(By.id("#test"));
((JavascriptExecutor) webDriver).executeScript(script, element);

3. 发送PAGE_DOWN、END等键盘事件

  • END:可以让页面直接下拉到底
  • HOME:上拉到顶端
  • PAGE_DOWN:小幅度下拉
org.openqa.selenium.Keys 模块中常用的变量属性 含义
  • Keys.DOWN, Keys.UP, Keys.LEFT,Keys.RIGHT 键盘箭头键
  • Keys.ENTER, Keys.RETURN 回车和换行键
  • Keys.HOME, Keys.END,
  • Keys.PAGE_DOWN,Keys.PAGE_UP
  • Home 键、End 键、PageUp 键和Page Down 键
  • Keys.ESCAPE, Keys.BACK_SPACE,Keys.DELETE Esc、Backspace 和字母键
  • Keys.F1, Keys.F2, . . . , Keys.F12 键盘顶部的F1 到F12 键
  • Keys.TAB Tab 键
  • ...
WebElement webElement = webDriver.findElement(By.cssSelector("body"));
                webElement.click(); // 有的时候必须点击一下,下拉才能生效(有的网站是这样,原因未找到)
#小幅度下拉
                webElement.sendKeys(Keys.PAGE_DOWN);
#或者直接下拉到底
              webElement.sendKeys(Keys.END);

查看源码可以看出来,selenium封装了键盘上的Key,意思是我们可以通过sendKeys发送键盘事件,比如搜索的时候点击ENTER事件

public enum Keys implements CharSequence {
    NULL('\ue000'),
    CANCEL('\ue001'),
    HELP('\ue002'),
    BACK_SPACE('\ue003'),
    TAB('\ue004'),
    CLEAR('\ue005'),
    RETURN('\ue006'),
    ENTER('\ue007'),
    SHIFT('\ue008'),
    LEFT_SHIFT(SHIFT),
    CONTROL('\ue009'),
    LEFT_CONTROL(CONTROL),
    ALT('\ue00a'),
    LEFT_ALT(ALT),
    PAUSE('\ue00b'),
    ESCAPE('\ue00c'),
    SPACE('\ue00d'),
    PAGE_UP('\ue00e'),
    PAGE_DOWN('\ue00f'),
    END('\ue010'),
    HOME('\ue011'),
    LEFT('\ue012'),
    ARROW_LEFT(LEFT),
    UP('\ue013'),
    ARROW_UP(UP),
    RIGHT('\ue014'),
    ARROW_RIGHT(RIGHT),
    DOWN('\ue015'),
    ARROW_DOWN(DOWN),
    INSERT('\ue016'),
    DELETE('\ue017'),
    SEMICOLON('\ue018'),
    EQUALS('\ue019'),
    NUMPAD0('\ue01a'),
    NUMPAD1('\ue01b'),
    NUMPAD2('\ue01c'),
    NUMPAD3('\ue01d'),
    NUMPAD4('\ue01e'),
    NUMPAD5('\ue01f'),
    NUMPAD6('\ue020'),
    NUMPAD7('\ue021'),
    NUMPAD8('\ue022'),
    NUMPAD9('\ue023'),
    MULTIPLY('\ue024'),
    ADD('\ue025'),
    SEPARATOR('\ue026'),
    SUBTRACT('\ue027'),
    DECIMAL('\ue028'),
    DIVIDE('\ue029'),
    F1('\ue031'),
    F2('\ue032'),
    F3('\ue033'),
    F4('\ue034'),
    F5('\ue035'),
    F6('\ue036'),
    F7('\ue037'),
    F8('\ue038'),
    F9('\ue039'),
    F10('\ue03a'),
    F11('\ue03b'),
    F12('\ue03c'),
    META('\ue03d'),
    COMMAND(META),
    ZENKAKU_HANKAKU('\ue040');

    private final char keyCode;

...
}

一个完整的示例

public class SeleniumTest {

    public static void main(String[] args) throws Exception {

        System.setProperty("webdriver.chrome.driver", "D:/tool/chromedriver.exe");
        WebDriver webDriver = new ChromeDriver();

        webDriver.get("https://m.weibo.cn/");
        Thread.sleep(1000);

        for (int i = 0; i < 10; i++) {
            System.out.println("sleep 1s");
            Thread.sleep(1000);
            ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0,"+(i * 500)+")");
        }
    }
}
目录
相关文章
|
5天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
15 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
23天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
76 4
|
28天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
73 2
|
2月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
36 1
|
2月前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
29 1