当前位置: 首页 > 知识库问答 >
问题:

Selenium屏幕截图侦听器捕获错误浏览器

莫繁
2023-03-14

我有一个通过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捕获错误的测试浏览器。我认为问题可能是以下之一

  • after方法已经退出浏览器(有时这是一种情况,因此我必须添加hasQuit布尔值)
  • 侦听器引用了错误的驱动程序对象。我相信这就是问题所在,但我不确定如何确保它引用了正确的驱动程序。

我有一个变通方法,它非常喜欢创建一个静态屏幕捕获对象,然后将其添加到AfterMethod中,但这不太理想,因为我希望使用一个侦听器。

共有1个答案

梁丘佑运
2023-03-14

从您的代码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