问题描述
有没有办法 - 也许有一个听众 - 截取每个加载的新页面的截图? 截取屏幕本身没有问题,我可以这样做,我只需要一种方法让它自动发生,所以我不必在每次点击某些内容之前手动输入screenshto方法。
 
     我正在查看WebDriverEventListner侦听器,但它似乎无法真正用于检测任何页面加载而没有事先指定将被加载的元素/将加载的页面? 
1楼
您可以通过更轻松地实现此
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);
 
  通过实现接口创建WebDriverListener类
 
     它有许多方法,如beforeClickOn , afterClickOn , beforeNavigateTo , afterNavigateTo , beforeFindBy , afterFindBy 。这些方法将在相应的动作ex之后自动调用:在查找元素之前和之后自动beforeFindBy和afterFindBy 
   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中创建任务计划程序来实现您的目标。
- 您应该创建一个扩展TimerTask的类(在java.util包中可用)。 TimerTask是一个抽象类。
 - 在要执行的public 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();
            }
        }
    }
}
 
  - 实例化定时器对象定时器time = new Timer();
 - 实例化Scheduled Task类Object ScheduledTask st = new ScheduledTask();
 通过Timer.shedule()方法分配计划任务。
import java.util.Timer;
//主类public class SchedulerMain {public static void main(String args [])throws InterruptedException {Timer time = new Timer(); //实例化定时器对象TakeScreenShot shot = new TakeScreenShot(driver.getTitle()); //通过初始化screenTitle time.schedule(shot,0,1000)实例化TakeScreenShot类; //每1秒创建一个Repetitively任务,这将调用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 } } }}
注意: - 如果您的代码不包含终止,则不会停止。 所以你应该使用程序终结器。
您可以按如下方式调用SchedulerMain类: -
String ags [] = null; SchedulerMain.main(AGS);