我有一个通过TestNG运行并行测试的selenium项目。当测试失败时,我有一个listener类来捕获屏幕截图。类如下
public class ScreenshotOnFailure extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult tr) {
WebDriver driver = SeleniumSetup.driverrunning;
boolean hasQuit = driver.toString().contains("(null)");
if(!hasQuit){
System.out.println(driver);
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
DateFormat dateFormat = new SimpleDateFormat("dd_MMM_yyyy__hh_mm_ssaa");
Date date = new Date();
String NewFileNamePath = null;
File directory = new File(".");
String methodName = tr.getMethod().getMethodName();
try {
NewFileNamePath =directory.getCanonicalPath() + "\\target\\surefire-reports\\html\\Screenshots\\"+methodName+"_"+ dateFormat.format(date) +"Listener.png";
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
FileUtils.copyFile(scrFile, new File(NewFileNamePath));
} catch (IOException e) {
e.printStackTrace();
}
String reportFilePath = ".\\Screenshots\\"+methodName+"_"+ dateFormat.format(date) +".png";
System.setProperty("org.uncommons.reportng.escape-output", "false");
Reporter.log("<a href=" + reportFilePath + ">Click to open screenshot</a><img src=" + reportFilePath + " height='350' width='700'>");
}
}}
在我的测试中,我有一个AfterMethod来清理测试
@AfterMethod(alwaysRun = true)
public void tearDown() throws Exception
{
driver.quit();
}
如果逐个运行测试,则捕获正确的浏览器屏幕截图,但如果运行parrallel,testsit捕获错误的测试浏览器。我认为问题可能是以下之一
我有一个变通方法,它非常喜欢创建一个静态屏幕捕获对象,然后将其添加到AfterMethod中,但这不太理想,因为我希望使用一个侦听器。
从您的代码webdriver driver=SeleniumSetup.driverrunning
来看,driverrunning
似乎是SeleniumSetup类中的静态驱动程序实例。因此,在并行执行中,它可能引用了错误的驱动程序对象。
ThreadLocal
可以帮助您创建线程安全驱动程序对象,下面是一个示例。
public class DriverFactory
{
private DriverFactory()
{
//Do-nothing..Do not allow to initialize this class from outside
}
private static DriverFactory instance = new DriverFactory();
public static DriverFactory getInstance()
{
return instance;
}
ThreadLocal<WebDriver> driver = new ThreadLocal<WebDriver>() // thread local driver object for webdriver
{
@Override
protected WebDriver initialValue()
{
return new FirefoxDriver(); // can be replaced with other browser drivers
}
};
public WebDriver getDriver() // call this method to get the driver object and launch the browser
{
return driver.get();
}
public void removeDriver() // Quits the driver and closes the browser
{
driver.get().quit();
driver.remove();
}
}
使用DriverFactory
获取驱动程序实例。
WebDriver driver = DriverFactory.getInstance().getDriver();
我试图根据用户输入的坐标捕捉区域截图。基本上,用户在屏幕上点击得到x,y坐标,然后在其他地方点击另一对x,y坐标,然后将其放入一个矩形中,并使用机器人库创建屏幕截图。 我有的问题是,我得到了随机截图,这不是用户输入的坐标,我怎么能考虑包括0的坐标,因为矩形值必须超过1。 以下是我迄今为止的代码:
可以使用SeleniumWebDriver拍摄屏幕截图。 它会截取网页的整个区域,但浏览器窗口(boarder)不包括在此截图中。 有没有一种方法来采取与Selenium网络驱动程序截图,以便整个浏览器窗口被捕获? 我想看到所有的状态栏,选项卡和按钮。 这是可能的。NET,但它有可能会屏蔽其他内容(例如,浏览器被最小化),所以我想使用selenium。
问题内容: 使用Google的“报告错误”或“反馈工具”,您可以选择浏览器窗口的区域来创建屏幕截图,并在屏幕上提交有关错误的反馈。 他们是如何做到的?Google的JavaScript反馈API已从此处加载,它们对反馈模块的概述将演示屏幕截图功能。 问题答案: JavaScript可以读取DOM并使用来相当准确地表示该DOM 。我一直在研究将HTML转换为画布图像的脚本。今天决定将其实现为发送您所
我试图用selenium和Firefox捕获http://www.flipkart.com url的屏幕。 它拍摄整个页面的屏幕快照,但它显示的内页图像对许多其他图像不可用。我无法纠正它。帮帮我.
问题内容: 我正在Windows 7上运行Selenium Standalone Server 2.25,并将Internet Explorer 9作为浏览器,对于需要打开浏览器的每个测试,都会遇到此错误: 我究竟做错了什么?完全相同的信息出现在Selenium Server控制台上。 问题答案: 为Internet Explorer中的所有区域启用“保护模式”设置后,错误消失(工具> Inter
问题内容: 我希望基于Selenium RC的自动化Web测试套件可以在遇到某些错误时为页面截图。测试套件是持续集成过程的一部分,从技术上讲,它是由作为 Windows服务 运行的CruiseControl执行的。 调用该方法以触发实际的屏幕截图。我已经注册了一个JUnit 以在任何测试失败时调用它。 问题是屏幕截图只是 空白文件 -PNG文件完全是黑色的。尺寸为1440x900。 从Eclips