Как получить скриншот полной веб-страницы с помощью Selenium и Java?

Как сделать скриншот для всей веб-страницы, а не только частично сверху с помощью Selenium WebDriver?

мой код java Selenium WebDriver выглядит следующим образом:

System.setProperty("webdriver.chrome.driver","/home/alex/Downloads/chromedriver_linux64/chromedriver");
WebDriver driver = new ChromeDriver();
driver.get("http://google.com");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File(RESULT_FILENAME));

какие идеи?

5 ответов


короткий ответ:НЕТ, ТЫ НЕ МОЖЕШЬ (подробная причина ниже). Но то, что вы можете сделать, это максимально использовать(монитор) вашего устройства просмотра.

Итак, запустите экземпляр браузера (драйвер) с помощью ChromeOptions(), который является методом настройки возможностей ChromeDriver-specific. Мы можем сделать следующее:

  • разверните окно (используя --start-maximized переключатель);
  • перейти в полноэкранный режим (F11-ключ на Windows Control+Cmd+F на Mac, используя --start-fullscreen переключатель).
  • Примечание: полный список переключателей командной строки Chrome можно найти здесь.

ваш код должен выглядеть так:

// Setting your Chrome options (Desired capabilities)
ChromeOptions options = new ChromeOptions();
options.add_argument('--start-maximized');
options.add_argument('--start-fullscreen');

// Creating a driver instance with the previous capabilities
WebDriver driver = new ChromeDriver(options);

// Load page & take screenshot of full-screen page
driver.get("http://google.com");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

теперь о полной проблеме страницы, все драйверы (chromedriver, geckodriver, IEDriver, EdgeDriver, etc.) реализуем Вебдрайвера консорциума W3C стандартные. Таким образом, они зависят от того, как команда WebDriver хочет выставить функциональность различных функций, в нашем случае, 'Take Screenshot'.

если Вы читаете определение, то оно ясно заявляет следующее:

команда Take Screenshot принимает скриншот контекста просмотра верхнего уровня окно просмотра.

Legacy-wise, некоторые драйверы смогли создать скриншот полной страницы (подробнее об этом здесь), как старый FirefoxDriver, IEDriver и т. д. Это больше не так, поскольку теперь все они реализуют (до буквы) стандарт WebDriver W3C.


Я нашел учебник http://www.softwaretestingmaterial.com/how-to-capture-full-page-screenshot-using-selenium-webdriver/ Для пользователей maven: помните о добавлении dependendency из https://mvnrepository.com/artifact/ru.yandex.qatools.ashot/ashot Когда я тестирую этот скрипт, у меня есть большие картинки, которые нельзя открыть в браузере (слишком большие или сломанные).

Так, может быть, кто-то знает любой скрипт, который фокусирует страницу на последнем используемом локаторе?


для некоторых страниц мне нужно сделать скриншот начала и конца страницы. Поэтому я использую 2 скриншота:

public static String javaIoTmpDir = System.getProperty("java.io.tmpdir"); //tmp dir
//create screenshot
    driver.manage().window().fullscreen();
    //For large pages - body over 850 px highh - take addition screenshot of the end of page
    if (driver.findElements(By.id("panel_body")).size()>0) {
        WebElement body = driver.findElement(By.id("panel_body"));
        int bodyHight = body.getSize().getHeight();
        if (bodyHight > 850) {
            Robot robot = new Robot();
            robot.keyPress(KeyEvent.VK_END);
            robot.keyRelease(KeyEvent.VK_END);
            Thread.sleep(1000);
            File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
            String timePictureEnd = javaIoTmpDir+"\scr_"+String.valueOf(System.currentTimeMillis())+getClass().toString().substring(getClass().toString().lastIndexOf(".qa.")+3)+".png";
            FileUtils.copyFile(scrFile, new File(timePictureEnd));
            robot.keyPress(KeyEvent.VK_HOME); //back to top page for next screen
            robot.keyRelease(KeyEvent.VK_HOME);
            Thread.sleep(1000);
        }
    }
    String timePicture = javaIoTmpDir+"\scr_"+String.valueOf(System.currentTimeMillis())+getClass().toString().substring(getClass().toString().lastIndexOf(".qa.")+3)+".png";
    File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(scrFile, new File(timePicture));

вы можете использовать Phantomjs для его достижения.

вот мой java-код:

public class PhantomjsTest {
    public static void main(String[] args) {
        try {

            long start=System.currentTimeMillis();
            //The page you want to screenshot
            String targetUrl="https://www.iqiyi.com/";
            //File path
            String targetImg="iqiyi.png";
            String command = "/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs /Users/hetiantian/SoftWares/phantomjs/examples/rasterize.js "+targetUrl + " " +targetImg;
            Process p = Runtime.getRuntime().exec(command);
            p.waitFor();
            System.out.println((System.currentTimeMillis()-start));
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

таким образом, вы можете получить скриншот полной веб-страницы Phantomjs. Когда вы используете Phantomjs для получения полного скриншота, вам нужно сначала загрузить Phantomjs. Затем запустите скрипт Phantomjs на скриншот. Подробнее об этом вы можете ссылаться phantomjs.org.


File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("c:\RESULT_FILENAME.png"));

попробуй такое