前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题

Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题

作者头像
heasy3
发布2020-08-02 12:53:50
2.1K0
发布2020-08-02 12:53:50
举报

使用selenuium chrome批量截图时,当某一个网页加载很慢时,get方法会阻塞到超时报错,一个报错后 标签页会停滞,url不再变化,而且之后的get也会不断报错:Timed out receiving message from renderer

在网上查阅解决办法不多,一个有效的方法是:使用一个备用标签页,当主标签页进行get跳转时超时了,就将主标签页关闭,使用备用标签页作为接下来的主标签页,并继续添加一个备用标签页。

添加标签页的方法网上查阅基本都是通过给driver发送键盘快捷键,如ctrl+t 开启新标签页,经实验我这里无效,只有使用一种执行js window.open的方法来开启标签页。

代码语言:javascript
复制
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 是我后加的 不知道为什么会出现好几个备用标签页,通过这个判断 关闭多余的标签页。其实并不影响主要截图逻辑。如果出错删掉该段即可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档