当前位置: 首页 > 知识库问答 >
问题:

Selenium-以等效间隔滚动以捕获整个网页时生成的额外屏幕截图

裴俊迈
2023-03-14

目标:使用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;

我知道目前还没有实现使用硒捕获整个网页的屏幕。任何有助于解决我上述逻辑的帮助都将不胜感激。

共有1个答案

通迪
2023-03-14

您的滚动逻辑是产生附加图像的原因。窗口。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”的图片) 有什么方法可以按选定的项目或元素捕获屏幕截图? 问题答案: 我们可以通过裁剪整个页面截图来获得元素截图,如下所示: