Как сделать скриншот с помощью Selenium WebDriver

Другое решение без использования метода loop-pure set-based с рекурсивным CTE

create function [dbo].InitCap (@value varchar(max))
returns varchar(max) as
begin

    declare
        @separator char(1) = ' ',
        @result varchar(max) = '';

    with r as (
        select value, cast(null as varchar(max)) [x], cast('' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j
        union all
        select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value]
        , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end ) [x]
        , left(r.[value], 1)
        , [no] + 1 [no]
        from r where value > '')

    select @result = @result +
    case
        when ascii([char]) between 97 and 122 
            then stuff(x, 1, 1, char(ascii([char])-32))
        else x
    end + @separator
    from r where x is not null;

    set @result = rtrim(@result);

    return @result;
end
462
задан DebanjanB 12 March 2019 в 11:35
поделиться

10 ответов

Java

Да, это возможно. Следующий пример находится на Java:

WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// Now you can do whatever you need to do with it, for example copy somewhere
FileUtils.copyFile(scrFile, new File("c:\\tmp\\screenshot.png"));
486
ответ дан 22 November 2019 в 22:47
поделиться

Существует несколько способов сделать скриншот с помощью Selenium WebDriver

Методы Java

Ниже приведены различные методы Java сделать снимок экрана :

  • Использование getScreenshotAs() из TakesScreenshot Интерфейс:

    • Кодовый блок:

      package screenShot;
      
      import java.io.File;
      import java.io.IOException;
      
      import org.apache.commons.io.FileUtils;
      import org.openqa.selenium.OutputType;
      import org.openqa.selenium.TakesScreenshot;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.support.ui.ExpectedConditions;
      import org.openqa.selenium.support.ui.WebDriverWait;
      
      public class Firefox_takesScreenshot {
      
          public static void main(String[] args) throws IOException {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://login.bws.birst.com/login.html/");
              new WebDriverWait(driver, 20).until(ExpectedConditions.titleContains("Birst"));
              File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
              FileUtils.copyFile(scrFile, new File(".\\Screenshots\\Mads_Cruz_screenshot.png"));
              driver.quit();
          }
      }
      
    • Снимок экрана:

[1146]

Mads_Cruz_screenshot

  • Если на веб-странице включена jquery , вы можете использовать из ] библиотека пазона / ашота :

    • Блок кода:

      package screenShot;
      
      import java.io.File;
      import javax.imageio.ImageIO;
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import org.openqa.selenium.support.ui.ExpectedConditions;
      import org.openqa.selenium.support.ui.WebDriverWait;
      
      import ru.yandex.qatools.ashot.AShot;
      import ru.yandex.qatools.ashot.Screenshot;
      import ru.yandex.qatools.ashot.shooting.ShootingStrategies;
      
      public class ashot_CompletePage_Firefox {
      
          public static void main(String[] args) throws Exception {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://jquery.com/");
              new WebDriverWait(driver, 20).until(ExpectedConditions.titleContains("jQuery"));
              Screenshot myScreenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(100)).takeScreenshot(driver);
              ImageIO.write(myScreenshot.getImage(),"PNG",new File("./Screenshots/firefoxScreenshot.png"));
              driver.quit();
          }
      }
      
    • Снимок экрана:

firefoxScreenshot.png

  • Использование из утверждают, что / селен -shutterbug библиотека:

    • Блок кода:

      package screenShot;
      
      import org.openqa.selenium.WebDriver;
      import org.openqa.selenium.firefox.FirefoxDriver;
      import com.assertthat.selenium_shutterbug.core.Shutterbug;
      import com.assertthat.selenium_shutterbug.utils.web.ScrollStrategy;
      
      public class selenium_shutterbug_fullpage_firefox {
      
          public static void main(String[] args) {
      
              System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
              WebDriver driver =  new FirefoxDriver();
              driver.get("https://www.google.co.in");
              Shutterbug.shootPage(driver, ScrollStrategy.BOTH_DIRECTIONS).save("./Screenshots/");
              driver.quit();
          }
      }
      
    • Снимок экрана:

2019_03_12_16_30_35_787.png [Тысяча сто сорок четыре]

2
ответ дан DebanjanB 12 March 2019 в 11:35
поделиться

Java

Я не смог получить принятый ответ для работы, но согласно текущей документации WebDriver , для Java 7 на OS X 10.9 сработало следующее:

import java.io.File;
import java.net.URL;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {

   public void myTest() throws Exception {
       WebDriver driver = new RemoteWebDriver(
               new URL("http://localhost:4444/wd/hub"),
               DesiredCapabilities.firefox());

       driver.get("http://www.google.com");

       // RemoteWebDriver does not implement the TakesScreenshot class
       // if the driver does have the Capabilities to take a screenshot
       // then Augmenter will add the TakesScreenshot methods to the instance
       WebDriver augmentedDriver = new Augmenter().augment(driver);
       File screenshot = ((TakesScreenshot)augmentedDriver).
               getScreenshotAs(OutputType.FILE);
   }
}
5
ответ дан Artjom B. 12 March 2019 в 11:35
поделиться

Python - Скриншот элемента:

Это довольно старый вопрос, и на него есть несколько ответов. Однако кажется, что снимок экрана определенного веб-элемента, использующего Python, здесь отсутствует.

location

Веб-элемент имеет свою собственную позицию на странице и, как правило, он измеряется в пикселях x и y и известен как (x, y) координаты элемента. И объект местоположения содержит два значения.

  1. location ['x'] - возвращает координату x для элемента
  2. location ['y'] - возвращает координату y для элемента

размер

Подобно местоположению, каждый WebElement имеет ширину и высоту; Доступен как размер объекта.

  1. size ['width'] - возвращает 'width' элемента
  2. size ['height'] - возвращает 'height' элемента

Using (x, y) координаты и ширина, значения высоты мы можем обрезать изображение и сохранить его в файле.

from selenium import webdriver
from PIL import Image

driver = webdriver.Firefox(executable_path='[Browser Driver Path]')
driver.get('https://www.google.co.in')

element = driver.find_element_by_xpath("//div[@id='hplogo']")

location = element.location
size = element.size

driver.save_screenshot("/data/image.png")

x = location['x']
y = location['y']
width = location['x']+size['width']
height = location['y']+size['height']

im = Image.open('/data/WorkArea/image.png')
im = im.crop((int(x), int(y), int(width), int(height)))
im.save('/data/image.png')

Примечание: Взято из http://allselenium.info/capture-screenshot-element-using-python-selenium-webdriver/

4
ответ дан Maikflow 12 March 2019 в 11:35
поделиться

C #

public void TakeScreenshot()
{
    try
    {            
        Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
        ss.SaveAsFile(@"D:\Screenshots\SeleniumTestingScreenshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        throw;
    }
}
101
ответ дан Artjom B. 12 March 2019 в 11:35
поделиться

PHP (PHPUnit)

Использует расширение PHPUnit_Selenium версии 1.2.7:

class MyTestClass extends PHPUnit_Extensions_Selenium2TestCase {
    ...
    public function screenshot($filepath) {
        $filedata = $this->currentScreenshot();
        file_put_contents($filepath, $filedata);
    }

    public function testSomething() {          
        $this->screenshot('/path/to/screenshot.png');
    }
    ...
}
33
ответ дан Artjom B. 12 March 2019 в 11:35
поделиться

Java (Robot Framework)

Я использовал этот метод для съемки экрана.

void takeScreenShotMethod(){
    try{
        Thread.sleep(10000)
        BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
        ImageIO.write(image, "jpg", new File("./target/surefire-reports/screenshot.jpg"));
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

Вы можете использовать этот метод там, где требуется.

9
ответ дан Artjom B. 12 March 2019 в 11:35
поделиться

Java

Я решил эту проблему. Вы можете расширить RemoteWebDriver, чтобы дать ему все интерфейсы, которые реализует его прокси-драйвер:

WebDriver augmentedDriver = new Augmenter().augment(driver); 
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
34
ответ дан Artjom B. 12 March 2019 в 11:35
поделиться

C #

using System;
using OpenQA.Selenium.PhantomJS;
using System.Drawing.Imaging;

namespace example.com
{
    class Program
    {
        public static PhantomJSDriver driver;

        public static void Main(string[] args)
        {
            driver = new PhantomJSDriver();
            driver.Manage().Window.Size = new System.Drawing.Size(1280, 1024);
            driver.Navigate().GoToUrl("http://www.example.com/");
            driver.GetScreenshot().SaveAsFile("screenshot.png", ImageFormat.Png);
            driver.Quit();
        }
    }
}

Требуются NuGetPackages:

  1. PhantomJS 2.0.0
  2. Selenium.Support 2.48.2
  3. Selenium.WebDriver 2.48.2

Протестировано с .NETFramework v4.5.2

6
ответ дан userlond 12 March 2019 в 11:35
поделиться

Да возможно сделать снимки экрана через Selenium Web Driver. Я в настоящее время использую Chrome Driver для привязки изображений веб-сайтов. Отошлите следующий метод captureScreenshot().

можно также добавить ограничение к веб-драйверу, такой, поскольку

  • используют бездисплейную версию веб-браузера
  • , отключают уведомление, когда страница загружается
  • , запускают полный экран и т.д.

, Если веб-сайт будет оборудован [1 112] Окно предупреждений , то веб-драйвер не сможет получить снимок экрана, так как исключение будет выдано. В том сценарии необходимо закрыть окно предупреждений и затем получить снимок экрана. Следующий фрагмент кода делает закрытие окна предупреждений.

public void captureScreenshot() throws InterruptedException, IOException {
        System.out.println("Creating Chrome Driver");
//        Set Chrome Driver
        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver.exe");
//       Add arguments to Chrome Options
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.addArguments("--headless");
        chromeOptions.addArguments("start-maximized");
        chromeOptions.addArguments("--disable-gpu");
        chromeOptions.addArguments("--start-fullscreen");
        chromeOptions.addArguments("--disable-extensions");
        chromeOptions.addArguments("--disable-popup-blocking");
        chromeOptions.addArguments("--disable-notifications");
        chromeOptions.addArguments("--window-size=1920,1080");
        chromeOptions.addArguments("--no-sandbox");
        chromeOptions.addArguments("--dns-prefetch-disable");
        chromeOptions.addArguments("enable-automation");
        chromeOptions.addArguments("disable-features=NetworkService");

                WebDriver driver = new ChromeDriver(chromeOptions);
                driver.get("https://www.google.com");
                System.out.println("Wait a bit for the page to render");
                TimeUnit.SECONDS.sleep(5);
                System.out.println("Taking Screenshot");
                File outputFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                String imageDetails = "D:\\Images";
                File screenShot = new File(imageDetails).getAbsoluteFile();
                FileUtils.copyFile(outputFile, screenShot);
                System.out.println("Screenshot saved: {}" + imageDetails);
        }
    }

, Чтобы принять Окно предупреждений и Получить Снимок экрана:

                    String alertText = alert.getText();
                    System.out.println("ERROR: (ALERT BOX DETECTED) - ALERT MSG : " + alertText);
                    alert.accept();
                    File outputFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
                    String imageDetails = "D://Images"
                    File screenShot = new File(imageDetails).getAbsoluteFile();
                    FileUtils.copyFile(outputFile, screenShot);
                    System.out.println("Screenshot saved: {}" + imageDetails);
                    driver.close();
0
ответ дан 22 November 2019 в 22:47
поделиться