Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题
时间:2022-07-22
本文章向大家介绍Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
使用selenuium chrome批量截图时,当某一个网页加载很慢时,get方法会阻塞到超时报错,一个报错后 标签页会停滞,url不再变化,而且之后的get也会不断报错:Timed out receiving message from renderer
在网上查阅解决办法不多,一个有效的方法是:使用一个备用标签页,当主标签页进行get跳转时超时了,就将主标签页关闭,使用备用标签页作为接下来的主标签页,并继续添加一个备用标签页。
添加标签页的方法网上查阅基本都是通过给driver发送键盘快捷键,如ctrl+t 开启新标签页,经实验我这里无效,只有使用一种执行js window.open的方法来开启标签页。
public class ChromeDriverUtil {
private static WebDriver driver = null;
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();
}
}
public static boolean getScreenshot(String url, String filePath) {
WebDriver driver = getDriver();
setTimeOut(60);
newTab();
try {
driver.get(url);
alertPersent();
Thread.sleep(3 * 1000);
//((JavascriptExecutor)driver).executeScript("window.stop();");
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File(filePath));
} catch (TimeoutException e) {
System.out.println("打开页面超时:" + url);
driver.close();
newTab();
return false;
} catch (Exception e) {
e.printStackTrace();
System.out.println("截屏失败:" + url);
return false;
}
System.out.println("截屏完成:" + url);
return true;
}
//处理alert窗口
private static void alertPersent() {
try {
getDriver().switchTo().alert().accept();
} catch (NoAlertPresentException ignored) {
}
}
private static void newTab(){
ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
if (tabs.size()<2){
driver.switchTo().window(tabs.get(0));
((JavascriptExecutor)driver).executeScript("window.open('https://www.baidu.com');");
tabs = new ArrayList<>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
}
tabs = new ArrayList<>(driver.getWindowHandles());
while (tabs.size()>2){
driver.switchTo().window(tabs.get(tabs.size()-1));
driver.close();
tabs = new ArrayList<>(driver.getWindowHandles());
}
}
/**
* 外部直接调用该方法
*/
public static void main(String[] args) throws InterruptedException {
ChromeDriverUtil.getScreenshot(homeUrl, filePath);
}
}
通过该程序我批量截取了700个网站 没有出现一直报错的情况,最后的while(tabs.size())>2 是我后加的 不知道为什么会出现好几个备用标签页,通过这个判断 关闭多余的标签页。其实并不影响主要截图逻辑。如果出错删掉该段即可。
- 印度6大科技真相 会让很多人大吃一惊
- 了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult
- Python原创0基础入门一看几张图就学会了
- ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
- 了解ASP.NET MVC几种ActionResult的本质:FileResult
- ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求
- 如何用Python和深度神经网络识别图像?
- 余军:分布式数据库在金融行业的创新实践
- 微信小游戏采用了我们都忽略的产品推广新切入点
- ASP.NET MVC下的四种验证编程方式[续篇]
- 如何把业务问题变成机器学习的问题?
- 这算是ASP.NET MVC的一个大BUG吗?
- 【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN
- 区块链技术在非能源领域的应用场景
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- [白话解析] 通过实例来梳理概念 :准确率 (Accuracy)、精准率(Precision)、召回率(Recall)和F值(F-Measure)
- [记录点滴] OpenResty中Redis操作总结
- [源码解析] 从TimeoutException看Flink的心跳机制
- [记录点滴] 一个解决Lua 随机数生成问题的办法
- [记录点滴] 记录一次用 IntelliJ IDEA遇到scope provided 的坑
- [记录点滴] 一个Python中实现flatten的方法
- [源码解析]Oozie来龙去脉之提交任务
- [记录点滴]Ionic编译过程的研究
- [记录点滴]OpenResty 支持http v2的问题
- [源码解析]Oozie来龙去脉之内部执行
- [记录点滴]编译安装luarocks、luacheck、luautf8
- [笔记整理] 一维搜索
- [记录点滴] 使用工具和命令对redis数据进行备份恢复
- [记录点滴]Spring Boot Admin源码分析笔记
- [记录点滴] luaxml编译过程