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

Automatically take a screenshot of every new page with Selenium Webdriver (java)

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

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

Yes you can achieve your objective by creating task scheduler in java.

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

注意:- 确保 WebDriver 驱动程序对象是 public 和静态的,并且可以从其他 classes.

访问
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 time = new Timer();
  2. 实例化计划任务class对象ScheduledTask st = new ScheduledTask();
  3. 通过Timer.shedule()方法分配定时任务。

    导入java.util.计时器;

    //主要class public class SchedulerMain { public static void main(String args[]) 抛出 InterruptedException { 定时器时间 = new Timer(); // 实例化定时器对象 TakeScreenShot shot = new TakeScreenShot(driver.getTitle()); // 通过初始化 screenTitle 实例化 TakeScreenShot class time.schedule(射门, 0, 1000); // 每 1 秒重复创建一次任务,这将调用 TakeScreenShot class

    的 运行()
        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 class 如下:-

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

您可以通过 EventFiringWebDriver

更轻松地实现此目的

EventFiringWebDriver 是一个支持注册 WebDriverEventListener 的任意 WebDriver 实例的包装器,例如用于记录目的。

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 class

beforeClickOnafterClickOnbeforeNavigateToafterNavigateTobeforeFindByafterFindBy等多种方法。这些方法会自动在相应的操作之后调用 ex :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,并在页面标题更改时截取屏幕截图。

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