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"));
· 결과
이렇게 스크롤된 이미지를 얻을 수 있었습니다!
맨 아래를 좋은 느낌으로 쓰는 것이 포인트군요.
Reference
이 문제에 관하여(Chrome에서도 전체 화면 캡처 얻기 (Selenium2 WebDriver)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Akihisa-Tokuda/items/468c071b7229264baa62
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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"));
Reference
이 문제에 관하여(Chrome에서도 전체 화면 캡처 얻기 (Selenium2 WebDriver)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Akihisa-Tokuda/items/468c071b7229264baa62텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)