使用Selenium Webdriver(java)自动截取每个新页面的屏幕截图

时间:2015-07-20 03:31:22

标签: java selenium webdriver listener screenshot

有没有办法 - 也许有一个听众 - 来截取每个加载的新页面?截取屏幕本身没有问题,我可以这样做,我只需要一种方法让它自动发生,所以我不必在每次点击某些内容之前手动输入screenshto方法。

我正在查看WebDriverEventListner侦听器,但它似乎无法用于检测任何页面加载,而无需事先指定要加载的元素/将要加载的页面?

2 个答案:

答案 0 :(得分:5)

您可以通过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一样检查标题,并在页面标题更改时截取屏幕截图。

希望这可以帮助你...如果你需要任何进一步的帮助,请退回

答案 1 :(得分:1)

  

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

  1. 您应该创建一个扩展TimerTask的类(在java.util包中可用)。 TimerTask是一个抽象类。
  2. 将您的代码写入要定期执行的public void run()方法中。
  3. 注意: - 确保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. 实例化定时器对象定时器时间=新定时器();
    2. 实例化计划任务类Object ScheduledTask st = new ScheduledTask();
    3. 通过Timer.shedule()方法分配计划任务。

      import java.util.Timer;

      //主要课程 公共类SchedulerMain {     public static void main(String args [])throws InterruptedException {         定时器时间=新的定时器(); //实例化定时器对象         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
              }
      
      
          }
      }
      

      }

    4. 注意: - 如果您的代码不包含终止,则不会停止。所以你应该使用一个程序终结器。

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

        String ags [] = null; SchedulerMain.main(AGS);