Chrome에서도 전체 화면 캡처 얻기 (Selenium2 WebDriver)

ChromeWebDriver에서 일반적으로 화면 캡처를 얻을 때. . .



크로스 브라우저 테스트하고 싶어서 WebDriver에서 테스트를 실행했지만,
Chrome의 WebDriver는 전체 화면 캡처를 받지 않습니다. . .
세로로 긴 화면이면 일부 밖에 캡처할 수 없습니다. . .

・보통의 스크린샷 취득 방법이라고. . .



일반 스크린샷
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(baseUrl + "/sample.html");
        driver.switchTo().defaultContent();
        TakesScreenshot ts = (TakesScreenshot) new Augmenter().augment(driver);
        FileUtils.moveFile(ts.getScreenshotAs(OutputType.FILE), new File("c:\\temp\\img-"+ System.currentTimeMillis() +".png"));


· 결과





↑↑이런 느낌으로 도중에 끊어진 파일이 보존되어 버립니다. 이건 안돼. 성난. .

이런 식으로 대응했습니다.



WebDriver에서 Js를 실행할 수 있으므로,
빙빙 스크롤하면서,
스크린샷을 찍고,
이미지를 연결하여 저장하도록 했습니다.

샘플은 다음과 같은 느낌입니다.

전체 화면을 촬영하는 스크린샷
        WebDriver driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(baseUrl + "/sample.html");
        driver.switchTo().defaultContent();
        TakesScreenshot ts = (TakesScreenshot) new Augmenter().augment(driver);

        //JS実行用のExecuter
        JavascriptExecutor jexec = (JavascriptExecutor) driver;

        //画面サイズで必要なものを取得
        int innerH = Integer.parseInt(String.valueOf(jexec.executeScript("return window.innerHeight")));
        int innerW =Integer.parseInt(String.valueOf(jexec.executeScript("return window.innerWidth")));
        int scrollH = Integer.parseInt(String.valueOf(jexec.executeScript("return document.documentElement.scrollHeight")));

        //イメージを扱うための準備
        BufferedImage img = new BufferedImage(innerW, scrollH, BufferedImage.TYPE_INT_ARGB);
        Graphics g = img.getGraphics();

        //スクロールを行うかの判定
        if(innerH>scrollH){
            BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
            g.drawImage(imageParts, 0, 0, null);
        } else {
            int scrollableH = scrollH;
            int i = 0;

            //スクロールしながらなんどもイメージを結合していく
            while(scrollableH>innerH){
                BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
                g.drawImage(imageParts, 0, innerH*i, null);
                scrollableH=scrollableH - innerH;
                i++;
                jexec.executeScript("window.scrollTo(0,"+innerH*i+")");
            }

            //一番下まで行ったときは、下から埋めるように貼り付け
            BufferedImage imageParts = ImageIO.read(ts.getScreenshotAs(OutputType.FILE));
            g.drawImage(imageParts, 0, scrollH - innerH, null);
        }

        ImageIO.write(img, "png", new File("c:\\temp\\mergeimg-"+ System.currentTimeMillis() +".png"));

· 결과



이렇게 스크롤된 이미지를 얻을 수 있었습니다!
맨 아래를 좋은 느낌으로 쓰는 것이 포인트군요.

좋은 웹페이지 즐겨찾기