目标:使用Java和JSExecutor for Selenium WebDriver以相等的时间间隔滚动以拍摄整个页面的屏幕截图。
问题:我在下面实现的方法是有效的,但是,我最终在网页的末尾有2-3个额外的屏幕截图——我想避免这些多余的屏幕截图。
滚动方法如下:
public static void pageScrollable() throws InterruptedException, IOException {
JavascriptExecutor jse = (JavascriptExecutor) driver;
//Find page height
pageHeight = ((Number) jse.executeScript("return document.body.scrollHeight")).intValue();
//Find current browser dimensions and isolate its height
Dimension d = driver.manage().window().getSize();
int browserSize = d.getHeight();
int currentHeight = 0;
System.out.println("Current scroll at: " + currentHeight);
System.out.println("Page height is: " + pageHeight + "\n");
//Scrolling logic
while(pageHeight>=currentHeight) {
jse.executeScript("window.scrollBy(0,"+currentHeight+")", "");
screenShot();
currentHeight+=browserSize;
System.out.println("Current scroll now at: " + currentHeight);
}
}
截图方法如下:
public static void screenShot() throws IOException, InterruptedException {
File screenShot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenShot, new File("C:\\FilePath\\Screen " + count + ".png"));
count++;
System.out.println("Current screenshot count: " + count);
}
以下变量定义为静态:
static int pageHeight = 0;
static int count = 0;
static WebDriver driver;
我知道目前还没有实现使用硒捕获整个网页的屏幕。任何有助于解决我上述逻辑的帮助都将不胜感激。
您的滚动逻辑是产生附加图像的原因。窗口。scrollBy
方法按像素数滚动,而不是滚动到绝对位置。您需要按browserSize
滚动。
也许您应该使用
int browserSize = ((Number) jse.executeScript("return window.innerHeight")).intValue();
我添加了一个完整的例子如何获得单页截图与Chrome:
package demo;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.imageio.ImageIO;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.chrome.ChromeDriver;
public class WebDriverDemo {
static int pageHeight = 0;
static int count = 0;
static WebDriver driver;
static List<BufferedImage> images = new LinkedList<>();
public static void main(String[] args) {
driver = new ChromeDriver();
driver.get("http://automationpractice.com/");
try {
pageScrollable();
} catch (WebDriverException | InterruptedException | IOException e) {
e.printStackTrace();
}
driver.quit();
}
public static void pageScrollable() throws InterruptedException, IOException {
JavascriptExecutor jse = (JavascriptExecutor) driver;
// Find page height
pageHeight = ((Number) jse.executeScript("return document.body.scrollHeight")).intValue();
// Find current browser dimensions and isolate its height
int browserSize = ((Number) jse.executeScript("return window.innerHeight")).intValue();
System.out.println("Page height is: " + pageHeight + "\n");
System.out.println("Browser height is: " + browserSize + "\n");
int currentHeight = 0;
System.out.println("Current scroll at: " + currentHeight);
System.out.println("Page height is: " + pageHeight + "\n");
// Scrolling logic
while (pageHeight >= currentHeight) {
screenShot();
currentHeight += browserSize;
jse.executeScript("window.scrollBy(0," + browserSize + ")", "");
System.out.println("Current scroll now at: " + currentHeight);
}
BufferedImage result = null;
Graphics2D g2d = null;
int heightCurr = 0;
System.out.println("Image count is " + images.size());
for (int i = 0; i < images.size(); i++) {
BufferedImage img = images.get(i);
int imageHeight = 0;
if (result == null) {
System.out.println("Image height is " + img.getHeight()); // differs from browserSize
imageHeight = pageHeight + images.size() * (img.getHeight() - browserSize);
result = new BufferedImage(img.getWidth(), imageHeight, img.getType());
g2d = result.createGraphics();
}
if (i == images.size() - 1) {
g2d.drawImage(img, 0, imageHeight - img.getHeight(), null);
} else {
g2d.drawImage(img, 0, heightCurr, null);
heightCurr += img.getHeight();
}
}
g2d.dispose();
ImageIO.write(result, "png", new File("screenshot.png"));
}
public static void screenShot() throws IOException, InterruptedException {
byte[] scr = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(scr));
images.add(img);
}
}
不幸的是,由于FireFox的窗口出现故障,它无法在FireFox中提供正确的结果。scrollBy
实现。
我试图创建一个通用的网络爬虫,将去一个网站和截图。我使用的是Python、Selnium和PhantomJS。问题是截图并没有捕获页面上的所有图像。例如,如果我去you tube,它不会捕捉主页图像下面的图像。(我没有足够高的rep来发布屏幕截图)我认为这可能与动态内容有关,但我已经尝试了等待函数,如隐式等待和on set_page_load_timeout方法。因为这是一个通用的爬虫,我不能等待
问题内容: 如何使用Selenium WebDriver 拍摄整个网页的屏幕快照( 全屏屏幕截图 ),而不仅仅是部分( 从上到下 )? 我的代码: ( Java绑定 ) 关于如何解决这个问题的任何想法? 问题答案: LE: 我看到很多人都对整页的截图感兴趣,所以我想我可能会用一些肯定的答案( 银色子弹 )来更新答案。 有很多Web测试框架可以( 只需最少的设置和工作 )即可生成 整页的屏幕截图 。
在selenium web驱动程序中,我无法使用testng和maven将其显示在控制台中 JAVAlang.VerifyError:(类:junereleasemain/NewTest,方法:testFirstResult签名:()V)java函数的参数不兼容。朗,同学们。java上的getDeclaredMethods0(本机方法)。朗,同学们。java上的privateGetDeclared
我有一个有30行的tableView,我还有一个位于tableView顶部的视图(不在tableView标题中),我想捕获屏幕的完整屏幕截图,包括视图和tableView的所有行,但我只能捕获tableView和视图的可见行。请帮助我,提前谢谢。这是我的代码和模拟器的屏幕截图。注意(我不希望我的视图位于tableview标题中,因为当我们滚动tableview时,它也会滚动,这就是为什么视图是固定
问题内容: 目前,我正在尝试使用Selenium WebDriver捕获屏幕截图。但是我只能获取整个页面的屏幕截图。但是,我想要的只是捕获页面的一部分,或者仅捕获基于ID或任何特定元素定位符的特定元素。(例如,我希望捕获图像ID =“ Butterfly”的图片) 有什么方法可以按选定的项目或元素捕获屏幕截图? 问题答案: 我们可以通过裁剪整个页面截图来获得元素截图,如下所示: