Как получить скриншот полной веб-страницы с помощью 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
-ключ на WindowsControl+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"));
попробуй такое