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 是我後加的 不知道爲什麼會出現好幾個備用標籤頁,通過這個判斷 關閉多餘的標籤頁。其實並不影響主要截圖邏輯。如果出錯刪掉該段即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章