可以使用Selenium WebDriver来截取屏幕截图吗?
(注意:不是Selenium Remote Control)
(注意:不是Selenium Remote Control)
可以的。以下示例是使用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"));
/tmp
常常位于自己的文件系统上,并且FirefoxDriver会将截图写入 /tmp
中。 - Tom AndersonHtmlUnitDriver
没有实现TakesScreenshot
接口(请参阅http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/TakesScreenshot.html以获取支持的驱动程序列表)。但你可以保存为HTML。 - Wernightorg.apache.commons.io.FileUtils
。 - Ben每个WebDriver都有一个.save_screenshot(filename)
方法。因此,对于Firefox,可以像这样使用:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')
令人困惑的是,还存在一个名为.get_screenshot_as_file(filename)
的方法,其功能与前者相同。
还有一些方法:.get_screenshot_as_base64()
(用于在HTML中嵌入)和.get_screenshot_as_png()
(用于检索二进制数据)。
注意,WebElements具有类似的.screenshot()
方法,但只捕获选定的元素。
driver.set_window_size(1366, 728)
来设置窗口大小即可。 - srdgpublic 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;
}
}
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);
});
});
takeScreenshot()
函数以了解它的确切含义。可能是使用canvas从javascript渲染的二进制图像。它可以是dom,在呈现之前。请深入研究。 - m3ndarequire 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :ie
driver.get "https://www.google.com"
driver.save_screenshot("./screen.png")
有更多的文件类型和选项可用,你可以在文件takes_screenshot.rb中查看。
headless
和 Firefox
。 - Ashleydriver.get
不需要括号,但是 driver.save_screenshot
需要? - Peter Mortensen我已解决此问题。您可以增强RemoteWebDriver
,使其具备代理驱动程序实现的所有接口:
WebDriver augmentedDriver = new Augmenter().augment(driver);
((TakesScreenshot)augmentedDriver).getScreenshotAs(...); // It works this way
它使用 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');
}
...
}
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);
}
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;
}
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"))