【问题标题】:Automatically take a screenshot of every new page with Selenium Webdriver (java)使用 Selenium Webdriver (java) 自动截取每个新页面的屏幕截图
【发布时间】:2015-07-20 03:31:22
【问题描述】:

有没有办法(也许是通过监听器)对每个加载的新页面进行截屏?截图本身没问题,我可以做到,我只需要一种方法让它自动发生,所以我不必在每次点击之前手动输入 screenshto 方法。

我正在查看WebDriverEventListner 侦听器,但如果不事先指定将被点击的元素/将加载的页面,它似乎不能真正用于检测任何页面加载?

【问题讨论】:

    标签: java selenium webdriver listener screenshot


    【解决方案1】:

    您可以通过EventFiringWebDriver 更轻松地实现这一目标

    EventFiringWebDriver 是对任意 WebDriver 实例的封装,它支持注册 WebDriverEventListener,例如用于记录目的。

    WebDriver driver = new FirefoxDriver();
    //create an object of EventFiringWebDriver and pass the driver instance
    EventFiringWebDriver wd = new EventFiringWebDriver(driver);
    //create an object of  class WebDriverListener and pass the driver instance
    WebDriverListener eventListener = new WebDriverListener(driver);
    wd.register(eventListener);
    

    通过实现WebDriverEventListener接口创建一个WebDriverListener类

    它有许多方法,如beforeClickOnafterClickOnbeforeNavigateToafterNavigateTobeforeFindByafterFindBy。这些方法将在相应操作后自动调用,例如:beforeFindByafterFindBy在找到元素之前和之后自动调用

       String title=""; //initially keep title empty
        //will automatically be called after click on an element
        public void afterClickOn(WebElement element, WebDriver driver) {
    
                //title is not equal to previous page title
    
                if(driver.getTitle()!=title){
    
                //take screenshot
    
                //assign the current title to string title
                title=driver.getTitle();
    
                }
    
            }
    

    同样,您可以覆盖上面指定的其他方法,也可以检查诸如 afterNavigateTo 之类的标题,并在页面标题更改时截取屏幕截图。

    希望这对您有所帮助...如果您需要任何进一步的帮助,请回复

    【讨论】:

      【解决方案2】:

      是的,您可以通过在 java 中创建任务调度程序来实现您的目标。

      1. 您应该创建一个扩展 TimerTask 的类(在 java.util 包中可用)。 TimerTask 是一个抽象类。
      2. 在要定期执行的公共 void run() 方法中编写代码。

      注意:- 确保 WebDriver 驱动程序对象是公共的和静态的,并且可以从其他类访问。​​

      import java.io.File;
      import java.io.IOException;
      import java.util.TimerTask;
      import java.util.Date;
      
      import org.apache.commons.io.FileUtils;
      import org.openqa.selenium.OutputType;
      import org.openqa.selenium.TakesScreenshot;
      // Create a class extends with TimerTask
      public class TakeScreenShot extends TimerTask {
      
          public static String screenTitle;
      
          public TakeScreenShot(String screenTitle){//constructor to initialize screenTitle
              this.screenTitle=screenTitle;
          }
      
          // Add your task here
          public void run() {
              if(screenTitle.equals(driver.getTitle().trim())){
                  //do nothing; // as long as we are on same page dont take screenshot again.
              }else{
                  screenTitle=driver.getTitle().trim();//if page changes then, take screenshot
                  File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
                  try {
                      FileUtils.copyFile(scrFile, new File("C:\\"+screenTitle+".png"));
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
      
          }
      }
      
      1. 实例化 Timer 对象 Timer time = new Timer();
      2. 实例化计划任务类 Object ScheduledTask st = new ScheduledTask();
      3. 通过 Timer.shedule() 方法分配定时任务。

        导入 java.util.Timer;

        //主类 公共类调度程序主{ 公共静态 void main(String args[]) 抛出 InterruptedException { 定时器时间 = new Timer(); // 实例化定时器对象 TakeScreenShot shot = new TakeScreenShot(driver.getTitle()); // 通过初始化 screenTitle 来实例化 TakeScreenShot 类 time.schedule(shot, 0, 1000); // 每 1 秒创建重复任务,这将调用 TakeScreenShot 类的 run()

            for (int i = 0; ;i++) {//infinite loop till driver is not made to null
                Thread.sleep(2000);
                if(driver==null){//make sure to make driver to null when application exists to stop this scheduler.
                    System.exit(0); //loop will break and Scheduler will stop
                }
        
        
            }
        }
        

        }

      注意:- 如果您的代码不包含终止,它不会停止。所以你应该使用程序终止符。

      1. 您可以如下调用 SchedulerMain 类:-

        字符串 ags[]=null; SchedulerMain.main(ags);

      【讨论】:

        猜你喜欢
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        相关资源
        最近更新 更多