Сделайте снимок экрана с помощью Selenium WebDriver
кто-нибудь знает, можно ли сделать снимок экрана с помощью Selenium WebDriver? (Примечание: не селен RC)
30 ответов:
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"));
Python
каждый WebDriver имеет
.save_screenshot(filename)
метод. Так что для Firefox, он может быть использован следующим образом:from selenium import webdriver browser = webdriver.Firefox() browser.get('http://www.google.com/') browser.save_screenshot('screenie.png') browser.quit()
смешения, а
.get_screenshot_as_file(filename)
метод также существует, что делает то же самое.есть также методы:
.get_screenshot_as_base64()
(для встраивания в HTML) и.get_screenshot_as_png()
(для получения двоичных данных).и обратите внимание, что WebElements имеют
.screenshot()
метод, который работает аналогично, но захватывает только выбранный элемент.
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; } }
Рубин
require 'rubygems' require 'selenium-webdriver' driver = Selenium::WebDriver.for :ie driver.get "https://www.google.com" driver.save_screenshot("./screen.png")
дополнительные типы файлов и параметры доступны, и вы можете увидеть их в takes_screenshot.РБ
JavaScript (Selenium-Webdriver)
driver.takeScreenshot().then(function(data){ var base64Data = data.replace(/^data:image\/png;base64,/,"") fs.writeFile("out.png", base64Data, 'base64', function(err) { if(err) console.log(err); }); });
Java
у меня этот вопрос решен. Вы можете увеличить
RemoteWebDriver
чтобы дать ему все его интерфейсы индикатора драйвер реализует:WebDriver augmentedDriver = new Augmenter().augment(driver); ((TakesScreenshot)augmentedDriver).getScreenshotAs(...); //works this way
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'); } ... }
C#
public Bitmap TakeScreenshot(By by) { // 1. Make screenshot of all screen var screenshotDriver = _selenium as ITakesScreenshot; Screenshot screenshot = screenshotDriver.GetScreenshot(); var bmpScreen = new Bitmap(new MemoryStream(screenshot.AsByteArray)); // 2. Get screenshot of specific element IWebElement element = FindElement(by); var cropArea = new Rectangle(element.Location, element.Size); return bmpScreen.Clone(cropArea, bmpScreen.PixelFormat); }
Java
public String captureScreen() { String path; try { WebDriver augmentedDriver = new Augmenter().augment(driver); File source = ((TakesScreenshot)augmentedDriver).getScreenshotAs(OutputType.FILE); path = "./target/screenshots/" + source.getName(); FileUtils.copyFile(source, new File(path)); } catch(IOException e) { path = "Failed to capture screenshot: " + e.getMessage(); } return path; }
Jython
import org.openqa.selenium.OutputType as OutputType import org.apache.commons.io.FileUtils as FileUtils import java.io.File as File import org.openqa.selenium.firefox.FirefoxDriver as FirefoxDriver self.driver = FirefoxDriver() tempfile = self.driver.getScreenshotAs(OutputType.FILE) FileUtils.copyFile(tempfile, File("C:\screenshot.png"))
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(); } }
вы можете использовать этот метод там, где это необходимо.
Java
кажется, здесь не хватает, - взяв скриншоты конкретный элемент в Java:
public void takeScreenshotElement(WebElement element) throws IOException { WrapsDriver wrapsDriver = (WrapsDriver) element; File screenshot = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE); Rectangle rectangle = new Rectangle(element.getSize().width, element.getSize().height); Point location = element.getLocation(); BufferedImage bufferedImage = ImageIO.read(screenshot); BufferedImage destImage = bufferedImage.getSubimage(location.x, location.y, rectangle.width, rectangle.height); ImageIO.write(destImage, "png", screenshot); File file = new File("//path//to"); FileUtils.copyFile(screenshot, file); }
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:
- PhantomJS 2.0.0
- селен.Поддержка 2.48.2
- селен.WebDriver 2.48.2
протестирован .NETFramework v4.5. 2
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); } }
Рубин (Огурец)
After do |scenario| if(scenario.failed?) puts "after step is executed" end time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M') file_path = File.expand_path(File.dirname(__FILE__) + '/../../../../../mlife_screens_shot')+'/'+time +'.png' page.driver.browser.save_screenshot file_path end Given /^snapshot$/ do time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M') file_path = File.expand_path(File.dirname(__FILE__) + '/../../../../../mlife_screens_shot')+'/'+time +'.png' page.driver.browser.save_screenshot file_path end
Рубин
time = Time.now.strftime('%a_%e_%Y_%l_%m_%p_%M_%S') file_path = File.expand_path(File.dirname(__FILE__) + 'screens_shot')+'/'+time +'.png' #driver.save_screenshot(file_path) page.driver.browser.save_screenshot file_path
PHP
public function takescreenshot($event) { $errorFolder = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . "ErrorScreenshot"; if(!file_exists($errorFolder)){ mkdir($errorFolder); } if (4 === $event->getResult()) { $driver = $this->getSession()->getDriver(); $screenshot = $driver->getWebDriverSession()->screenshot(); file_put_contents($errorFolder . DIRECTORY_SEPARATOR . 'Error_' . time() . '.png', base64_decode($screenshot)); } }
PowerShell
Set-Location PATH:\to\selenium Add-Type -Path "Selenium.WebDriverBackedSelenium.dll" Add-Type -Path "ThoughtWorks.Selenium.Core.dll" Add-Type -Path "WebDriver.dll" Add-Type -Path "WebDriver.Support.dll" $driver = New-Object OpenQA.Selenium.PhantomJS.PhantomJSDriver $driver.Navigate().GoToUrl("https://www.google.co.uk/") # Take a screenshot and save it to filename $filename = Join-Path (Get-Location).Path "01_GoogleLandingPage.png" $screenshot = $driver.GetScreenshot() $screenshot.SaveAsFile($filename, [System.Drawing.Imaging.ImageFormat]::Png)
других водителей...
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver $driver = New-Object OpenQA.Selenium.Firefox.FirefoxDriver $driver = New-Object OpenQA.Selenium.IE.InternetExplorerDriver $driver = New-Object OpenQA.Selenium.Opera.OperaDriver
Python
вы можете захватить изображение из windows с помощью веб-драйвера python. Используйте код ниже, на какой странице нужно сделать снимок экрана
driver.save_screenshot('c:\foldername\filename.extension(png,jpeg)')
C#
public static void TakeScreenshot(IWebDriver driver, String filename) { // Take a screenshot and save it to filename Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot(); screenshot.SaveAsFile(filename, ImageFormat.Png); }
Java
public void captureScreenShot(String obj) throws IOException { File screenshotFile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(screenshotFile,new File("Screenshots\"+obj+""+GetTimeStampValue()+".png")); } public String GetTimeStampValue()throws IOException{ Calendar cal = Calendar.getInstance(); Date time=cal.getTime(); String timestamp=time.toString(); System.out.println(timestamp); String systime=timestamp.replace(":", "-"); System.out.println(systime); return systime; }
С помощью этих двух способов вы можете сделать снимок экрана с датой и временем, а также.
Java
используя RemoteWebDriver, после увеличения узла с возможностью скриншота, я бы сохранил скриншот следующим образом:
void takeScreenShotMethod(){ try{ Thread.sleep(10000); long id = Thread.currentThread().getId(); BufferedImage image = new Robot().createScreenCapture(new Rectangle( Toolkit.getDefaultToolkit().getScreenSize())); ImageIO.write(image, "jpg", new File("./target/surefire-reports/" + id + "/screenshot.jpg")); } catch( Exception e ) { e.printStackTrace(); } }
вы можете использовать этот метод там, где это необходимо. Затем я предполагаю, что вы можете настроить таблицу стилей maven-surefire-report-plugin в surefire-reports/html/custom.css, чтобы ваши отчеты включали ссылку на правильный скриншот для каждого теста?
Java
String yourfilepath = "E:\username\Selenium_Workspace\foldername"; // take a snapshort File snapshort_file = ((TakesScreenshot) mWebDriver) .getScreenshotAs(OutputType.FILE); // copy the file into folder FileUtils.copyFile(snapshort_file, new File(yourfilepath));
надеюсь, что это решит вашу проблему
C#
вы можете использовать следующий фрагмент кода/функцию, чтобы сделать снимок экрана с селеном:
public void TakeScreenshot(IWebDriver driver, string path = @"output") { var cantakescreenshot = (driver as ITakesScreenshot) != null; if (!cantakescreenshot) return; var filename = string.Empty + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + DateTime.Now.Millisecond; filename = path + @"\" + filename + ".png"; var ss = ((ITakesScreenshot)driver).GetScreenshot(); var screenshot = ss.AsBase64EncodedString; byte[] screenshotAsByteArray = ss.AsByteArray; if (!Directory.Exists(path)) Directory.CreateDirectory(path); ss.SaveAsFile(filename, ImageFormat.Png); }
вы можете попробовать AShot API. Вот ссылка github для того же самого.
https://github.com/yandex-qatools/ashot
некоторые из тестов здесь...
C# (Ranorex API)
public static void ClickButton() { try { // code } catch (Exception e) { TestReport.Setup(ReportLevel.Debug, "myReport.rxlog", true); Report.Screenshot(); throw (e); } }
Python
def test_url(self): self.driver.get("https://www.google.com/") self.driver.save_screenshot("test.jpg")
он сохранит скриншот в том же каталоге, где сохранен скрипт.
Java
думал, что я дам свое полное решение, так как есть два разных способа получить снимок экрана. Один из них находится в локальном браузере, а другой-в удаленном браузере. Я даже вставляю изображение в отчет html
@After() public void selenium_after_step(Scenario scenario) throws IOException, JSONException { if (scenario.isFailed()){ scenario.write("Current URL = " + driver.getCurrentUrl() + "\n"); try{ driver.manage().window().maximize(); //Maximize window to get full screen for chrome }catch (org.openqa.selenium.WebDriverException e){ System.out.println(e.getMessage()); } try { if(isAlertPresent()){ Alert alert = getAlertIfPresent(); alert.accept(); } byte[] screenshot; if(false /*Remote Driver flow*/) { //Get Screen shot from remote driver Augmenter augmenter = new Augmenter(); TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver); screenshot = ts.getScreenshotAs(OutputType.BYTES); } else { //get screen shot from local driver //local webdriver user flow screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES); } scenario.embed(screenshot, "image/png"); //Embed image in reports } catch (WebDriverException wde) { System.err.println(wde.getMessage()); } catch (ClassCastException cce) { cce.printStackTrace(); } } //seleniumCleanup(); }
Selenide / Java
вот как селенида проект делает это, что делает проще, чем любой другой способ сделать это:
import static com.codeborne.selenide.Selenide.screenshot; screenshot("my_file_name");
Для Junit:
@Rule public ScreenShooter makeScreenshotOnFailure = ScreenShooter.failedTests().succeededTests();
Для TestNG:
import com.codeborne.selenide.testng.ScreenShooter; @Listeners({ ScreenShooter.class})