Java 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)+")"); } } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python集成包地址 Anaconda 一键安装拥有所有包
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/82495040 点击进入官网下载https://www.anaconda.com/download/
- 下一篇
JDBC 结构
JDBC Java 应用通过 JDBC 连接到数据库执行有五步 Register the driver class Creating connection Creating statement Executing queries Closing connection DriverManager class DriverManager 类顾名思义,用来管理 driver。主要有注册接口。getConnection 的时候用 DriverManager 当前的 classloader 尝试顺序加载注册的 driver,加载到哪个用那个。 Connection Interface 一个 connection 是一次应用和数据库的 session。也是 Statement, PreparedStatement, and DatabaseMetaData 的
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案