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

数据采集中,经常遇到动态加载的数据,我们经常使用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)+")");
        }
    }
}

作者:LI木水
链接:https://www.jianshu.com/p/3c6840ccf17d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/wangcp-2014/p/10907725.html

时间: 2024-10-08 17:42:10

selenium操作下拉滚动条的几种方法的相关文章

selenium 操作下拉处理

操作下拉框处理 在网页中,有时候会遇到下拉框处理,这时候使用Webdriver提供的select类来处理. ##操作下拉框处理 #coding = utf-8 from selenium import webdriver import os,time driver = webdriver.Firefox() file_path = 'file:///' + os.path.abspath("checkbox.html") driver.get(file_path) time.sleep

吾八哥学Selenium(四):操作下拉框select标签的方法

我们在做web页面自动化测试的时候会经常遇到<select></select>标签的下拉框,那么在Python里如何实现去操作这种控件呢?今天就给大家分享一下这个玩法.为了让大家学习更方便,我准备了一个测试页面. 测试的html页面代码为: <html> <head> <title>学Python网 - Selenium学习测试页面</title> <body> 请选择2018年春节回家的方式! <select id

上拉刷新和下拉刷新的两种方法(包括使用第三方库MJRefresh)

一.使用苹果原生的方法 1.下拉刷新 2.上拉刷新 (1 首先要新建一个footer得XIB文件,当然同时包括对应的控制器文件,例如在XIB文件中可以如下拖拉对应的控件 (2 然后在代码文件中写一个实例方法 +(instancetype)footer { return  [[[NSBundle mainBundle] loadNibNamed:@"XIB文件名" owner:nil options:nil] lastObject]; } (3 然后在我们的列表控制器中调用: /** *

生成下拉框的几种方法总结——数据来源:枚举

上节介绍数据来源是数据库,这节介绍对枚举进行数据获取,形成下拉列表. 使用场景:某些状态值获取等,一般是数据量小,不需要在数据库中进行维护的数据集 1.前提要有枚举数据 package com.test.entity.neworder; import java.util.Objects; /** * 新订单状态 * * @author 刘涛 */ public enum NewOrderStateEunm { //已删除 已删除(0, "已删除"), //已创建 已创建(1, &quo

jQuery自定义漂亮的下拉框插件8种效果演示

原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 <!DOCTYPE html> <html lang="en" class=

Jquery操作下拉框(DropDownList)实现取值赋值

Jquery操作下拉框(DropDownList)想必大家都有所接触吧,下面与大家分享下对DropDownList进行取值赋值的实现代码 1. 获取选中项: 获取选中项的Value值: $('select#sel option:selected').val(); 或者 $('select#sel').find('option:selected').val(); 获取选中项的Text值: $('select#seloption:selected').text(); 或者 $('select#sel

selenium webdriver下拉框的处理方式

1.下拉框有2种,1种为通过F12可以定位到整个下拉框,定位到的代码html为<select id="ctl00_MainContentPlaceHolder_NoticeManage1_ddlNoticeType" class="select" name="ctl00 $MainContentPlaceHolder$NoticeManage1$ddlNoticeType"><option value="0"

jQuery操作下拉框的text值和val值

jQuery操作下拉框的text值和val值 1,JS源码 <select name="select1" id="select1" style="width:300px;"> <option value="">-- 请选择 --</option> <c:forEach items="${bi_role_list}" var="bi_role" v

suse下设置IP的两种方法

/Files/yzhxhwt/DB_51aspx.rar 第一种SUSE Linux IP设置方法ifconfig eth0 192.168.1.22 netmask 255.255.255.0 uproute add default gw 192.168.1.2 释义:#IP配置,包括子网掩码,看情况修改eth0和192.168.1.22 #网关修改 ,看情况修改192.168.1.2 第二种SUSE Linux IP设置方法 在suse操作系统中每个网卡都有一个配置文件,在/etc/sysc