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

Selenium webdriver中未捕获整页屏幕截图,因为正文返回时高度为0

阎慈
2023-03-14

 import java.util.concurrent.TimeUnit;    
    import javax.imageio.ImageIO;    
    import org.openqa.selenium.Dimension;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.OutputType;
    import org.openqa.selenium.TakesScreenshot;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.remote.Augmenter;

    import com.epath.smoketest.pageobjects.Login;import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.IOException;

    import com.epath.smoketest.pageobjects.Navigation;

    public class Screenshoptcapture {

        private static int scrollTimeout = 0;

        public Screenshoptcapture(int timeout) {
            scrollTimeout = timeout;
        }

        private static String getFullHeight(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            return js.executeScript("return document.body.scrollHeight").toString();
        }

        private static int getFullWidth(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            return ((Long) js.executeScript("return window.innerWidth", new Object[0])).intValue();
        }

        private static int getWindowHeight(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            return ((Long) js.executeScript("return window.innerHeight", new Object[0])).intValue();
        }

        private static void waitForScrolling() {
            try {
                Thread.sleep(scrollTimeout);
            } catch (InterruptedException ignored) {
            }
        }

        private static BufferedImage getScreenshotNative(WebDriver wd) {
            ByteArrayInputStream imageArrayStream = null;
            TakesScreenshot takesScreenshot = (TakesScreenshot) new Augmenter().augment(wd);
            try {
                imageArrayStream = new ByteArrayInputStream(takesScreenshot.getScreenshotAs(OutputType.BYTES));
                return ImageIO.read(imageArrayStream);
            } catch (IOException e) {
                throw new RuntimeException("Can not parse screenshot data", e);
            } finally {
                try {
                    if (imageArrayStream != null) {
                        imageArrayStream.close();
                    }
                } catch (IOException ignored) {
                }
            }
        }

        public static BufferedImage getScreenshot(WebDriver wd) {
            JavascriptExecutor js = (JavascriptExecutor) wd;
            int allHeight = Integer.parseInt(getFullHeight(wd));
            int allWidth = getFullWidth(wd);
            int winHeight = getWindowHeight(wd);
            int scrollTimes = allHeight / winHeight;
            int tail = allHeight - winHeight * scrollTimes;
            BufferedImage finalImage = new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D graphics = finalImage.createGraphics();
            for (int n = 0; n < scrollTimes; n++) {
                js.executeScript("scrollTo(0, arguments[0])", winHeight * n);
                waitForScrolling();
                BufferedImage part = getScreenshotNative(wd);
                graphics.drawImage(part, 0, n * winHeight, null);
            }
            if (tail > 0) {
                js.executeScript("scrollTo(0, document.body.scrollHeight)");
                waitForScrolling();
                BufferedImage last = getScreenshotNative(wd);
                BufferedImage tailImage = last.getSubimage(0, last.getHeight() - tail, last.getWidth(), tail);
                graphics.drawImage(tailImage, 0, scrollTimes * winHeight, null);
            }
            graphics.dispose();
            return finalImage;
        }

        public static void screenshotUsingjavaScript(WebDriver wd, String filename) {
            try {
                ImageIO.write(getScreenshot(wd), "PNG", new File(filename));
            } catch (IOException e) {
                System.out.println(e);
            }
        }

        public static void main(String argc[]) {
            System.setProperty("webdriver.chrome.driver", "C:\\Users\\admin\\Desktop\\Required Software For Automation\\chromedriver.exe");

            WebDriver driver = new ChromeDriver();
            driver.manage().window().fullscreen();
            driver.get(" ");        
            Screenshoptcapture.screenshotUsingjavaScript(driver, "C:\\Users\\admin\\Desktop\\Required Software For Automation\\Userlist.png");
            Utils.pauseTestExecution(8);

            driver.quit();
        }
    }

共有1个答案

尉迟正奇
2023-03-14

也许你的身体实际高度为0。可能您的直接子对象是浮点数:或位置:绝对/固定的(所以他们是从框中取出的)?可能身体高度为0 或<代码>最大高度:0

 类似资料:
  • 目前,我正在尝试使用SeleniumWebDriver捕获一个屏幕截图。但我只能获得整个页面的屏幕截图。然而,我想要的只是捕获页面的一部分,或者基于ID或任何特定元素定位器捕获特定元素。(例如,我希望用image id=“Butterfly”捕捉图片) 有没有办法按所选项目或元素捕获屏幕截图?

  • 我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:

  • 我试图创建一个通用的网络爬虫,将去一个网站和截图。我使用的是Python、Selnium和PhantomJS。问题是截图并没有捕获页面上的所有图像。例如,如果我去you tube,它不会捕捉主页图像下面的图像。(我没有足够高的rep来发布屏幕截图)我认为这可能与动态内容有关,但我已经尝试了等待函数,如隐式等待和on set_page_load_timeout方法。因为这是一个通用的爬虫,我不能等待

  • 我有一个有30行的tableView,我还有一个位于tableView顶部的视图(不在tableView标题中),我想捕获屏幕的完整屏幕截图,包括视图和tableView的所有行,但我只能捕获tableView和视图的可见行。请帮助我,提前谢谢。这是我的代码和模拟器的屏幕截图。注意(我不希望我的视图位于tableview标题中,因为当我们滚动tableview时,它也会滚动,这就是为什么视图是固定

  • 问题内容: 我想获得活动的“全页”屏幕截图。该视图包含一个RecyclerView,其中包含许多项。 我可以使用此功能拍摄当前视图的屏幕截图: 但是它仅包含我可以正常查看的项目(符合预期)。 截屏时,有什么方法可以使RecyclerView神奇地完整显示(一次显示所有项目)? 如果没有,我应该如何解决这个问题? 问题答案: 这是我的解决方案,当 所有项目的尺寸都相同 并且 只有一种类型的项目时 。

  • 问题内容: 如何获取Android屏幕的可用高度?我需要减去状态栏/菜单栏或屏幕上可能显示的任何其他装饰的高度,并且需要它适用于所有设备。另外,我需要在onCreate函数中知道这一点。我知道之前曾有人问过这个问题,但我已经尝试过他们的解决方案,但没有一个起作用。这是我尝试过的一些方法: 我已经在API 7-17上测试了此代码。不幸的是,在API 13的水平和垂直底部都没有多余的空间,而在API