赞
踩
使用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 是我后加的 不知道为什么会出现好几个备用标签页,通过这个判断 关闭多余的标签页。其实并不影响主要截图逻辑。如果出错删掉该段即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。