【Selenium】使用ChromeDriver实现页面快照截图
效果图
以下为编写流程,全代码+注释在文章末尾
下载插件
1. 下载Chrome浏览器版本和ChromeDriver
谷歌版本号114以上版本chrome、chromedriver、chrome-headless-shell下载地址:https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json
本文章使用Chrome、ChromeDriver版本 126.0.6478.182
2. Maven配置依赖
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
<!-- Maven dependency for Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0-jre</version>
</dependency>
</dependencies>
Java代码
3. 设置属性/配置
注意1:设置Chrome和ChromeDriver路径时,我直接将两文件放在项目根目录下得出此路径。如放在其他路径下需写全路径/相对路径。
例如 E:\SG_Company\Selenium1\chromedriver-win64\chromedriver.exe
//浏览器的安装后位置,如果是默认安装路径,这句话可以省略
System.setProperty("webdriver.chrome.bin","chrome-win64/chrome.exe");
//设置下载的驱动路径,Windows对应chromedriver.exe Linux对应chromedriver,具体路径看你把驱动放在哪
System.setProperty("webdriver.chrome.driver","chrome-win64/chromedriver.exe");
//设置Chrome参数对象
ChromeOptions options = new ChromeOptions();
//ssl证书支持
options.setCapability("acceptSslCerts", true);
//截屏支持
options.setCapability("takesScreenshot", true);
//css搜索支持
options.setCapability("cssSelectorsEnabled", true);
//不打开真实浏览器而使用虚拟浏览器执行操作 = options.addArguments("headless");
options.setHeadless(true);
//me : 禁用沙箱模式,Chrome在没有真正的权限的情况下也可以运行 = options.addArguments("no-sandbox");
options.setCapability("sandbox",false);
//设置浏览器参数
//允许所有请求
options.addArguments("--remote-allow-origins=*");
//设置Webdriver启动chrome为默认用户的配置信息(包括书签、扩展程序等),否则将以默认空白配置启动Chrome
//如果需要ChromeDriver执行插件,则需要加上配置信息
options.addArguments("user-data-dir=C:/Users/xxxx/AppData/Local/Google/Chrome for Testing/User Data");
//禁用信息栏,信息栏通常用于显示非阻塞的通知和提示信息
options.addArguments("disable-infobars");
//禁用浏览器中的弹出窗口拦截功能。这个参数允许Selenium脚本在执行过程中不会因为浏览器拦截弹出窗口而导致测试失败或脚本执行异常,通过禁用弹出窗口拦截,可以确保测试脚本能够正常地处理那些需要用户手动允许的弹出窗口,从而保证测试的顺利进行
options.addArguments("--disable-popup-blocking");
//禁用GPU加速可以减少资源消耗,但是整体上来说禁不禁用都可以
//options.addArguments("--disable-gpu");
//打开ChromeDriver
ChromeDriver driver = new ChromeDriver(options);
//设置超时,避免有些内容加载过慢导致截不到图
//指定页面加载的超时时间。定义WebDriver等待页面完全加载完成的最长时间为30秒,如果在这个时间内页面没有完全加载完成,WebDriver将会抛出一个超时错误
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
//设置全局隐式等待时间。WebDriver在查找页面元素时,如果元素未立即出现,WebDriver将等待指定的时间以寻找该元素。
//如果这30秒内元素被找到,那么WebDriver将继续执行后续的操作;如果30秒后元素仍未出现,那么WebDriver将抛出NoSuchElementException异常。
//隐式等待是全局设置的,意味着它会影响到WebDriver实例中执行的所有元素查找操作。
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//脚本执行超时,设置JavaScript执行超时时间。具体来说,这个方法设置了WebDriver执行JavaScript脚本的最大等待时间
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
4. 访问登录地址,判断cookie是否有效,有效直接读,无效写入新的cookie存储并返回
注意1:这里checkCookieValied是我自己尝试判断是否过期,直接拿时间对比。实际运用中Cookie基本被加密无法破解,也可以直接调用公司的 “判断是否有效” 方法
注意2:此处redis写得不够详细,具体存储位置可根据个人选择编写
static private final String LoginURL = "https://xxxx/xxx/public/login/login.html";
driver.get(LoginURL);
( checkCookieValied() ? readCookieFile() : writeCookieFile(driver) ).forEach( (c) -> driver.manage().addCookie(c));
/**
* 判断 Cookie没有过期,如果过期拿新的 Cookie并存储
* @return True没过期 False过期了
*/
public boolean checkCookieValied(){
//获取redis中的cookie 这里方便测试我就直接创建新cookie对象了
//Set<Cookie&