Java selenuim用执行js模拟鼠标滚动的方式
时间:2022-07-22
本文章向大家介绍Java selenuim用执行js模拟鼠标滚动的方式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目: Java selenuim用执行js模拟鼠标滚动的方式完成页面滚动的异步加载及Java接收浏览器js的返回值
在使用selenuim webdriver爬取网页时,经常会有很多网页并不是访问链接就会加载全部内容的,而是需要鼠标向下滚动,动态的加载内容,比如知乎首页。这样在爬取的过程中并不能直接抓数据,需要先模拟鼠标滚动,让页面先加载出来才行。
我使用的方法是利用如下js代码来完成页面的滚动,每次滚动多少可以根据不同情况自行调整。
scroll(0,document.body.scrollHeight)
在浏览器控制台输入js代码即可看到效果,和程序中使用起来是一样的。可以先在真实场景调试好每次要滚动多少会触发加载,然后再写进代码中使用。同理想要横向滑动的话,就改变第一个参数,第二个参数置为0。
对于部分网页来说,是不会允许无限制的加载新数据的,换句话说就是滚动加载出的数据是有一定限制的。那么如何使页面滚动到恰好加载到没新数据可加载 就是一个新问题了。想到加载过程中 document.body.scrollHeight 这个值是会根据每次新加载数据动态变化的,那么也就是说 当执行一次js代码后,这个值没有发生改变,就代表本次没有加载新的数据了。
接下来的问题就是如何使Java代码能够接收到浏览器执行的js代码返回值的问题了。很简单,在js代码上加上return 即可。注意有一个空格。
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
/**
* 描述 :谷歌浏览器驱动工具类
* 作者 :WYH
* 时间 :2019/8/29 13:57
**/
public class ChromeDriverUtil {
private static WebDriver driver;
private final static int DEFAULT_TIMEOUT = 30;
static {
System.setProperty("java.awt.headless", "true");
String driverPath = "D:/chromedriver.exe";//驱动需下载到指定目录
ChromeOptions option = new ChromeOptions();
option.addArguments("disable-infobars");
option.addArguments("start-maximized");
//option.addArguments("headless");
System.setProperty("webdriver.chrome.driver", driverPath);
driver = new ChromeDriver(option);
driver.manage().timeouts().pageLoadTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
}
public static void setTimeOut(int second) {
driver.manage().timeouts().pageLoadTimeout(second, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(second, TimeUnit.SECONDS);
}
public static WebDriver getDriver() {
return driver;
}
public static void quit() {
if (driver != null) {
driver.quit();
}
}
/**
* 滑动页面到最底部 返回true代表加载了新的 false代表已经没有再加载的了
*/
private static boolean scrollDown() {
boolean flag = false;
if (driver != null) {
try {
Long before = (Long) ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
((JavascriptExecutor) driver).executeScript("scroll(0,document.body.scrollHeight)");
//给页面预留加载时间
Thread.sleep(2000);
Long after = (Long) ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
if (!(before.equals(after))) flag = true;
} catch (Exception e) {
e.printStackTrace();
}
}
return flag;
}
public static void loadAll() {
while (scrollDown());
}
}
只要是true,就继续执行scrollDown函数,直到它返回false。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AngularJS 多视图应用中的登录认证
- Android | Tangram动态页面之路(三)使用
- Android | Tangram动态页面之路(四)vlayout原理
- 基于QuestaSIM的SystemVerilog DPI使用流程(step by step)
- Android | Tangram动态页面之路(五)Tangram原理
- Android | Tangram动态页面之路(六)数据分离
- 在 mono 下使用微软的 OWIN 认证中间件
- 重温四大基础数据结构:数组、链表、队列和栈
- C# 程序在 Docker 中响应 Unix 信号
- Android | Tangram动态页面之路(七)硬核的Virtualview
- Spark SQL如何选择join策略
- 江湖事儿 | 技术人如何做好晋升准备
- Dockerfile 的 ENTRYPOINT 与 CMD
- Docker Entry Script 详解
- 使用 docker-compose 替代 docker run