Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SeleniumWebDriver(java)自动拍摄每个新页面的屏幕截图_Java_Selenium_Webdriver_Listener_Screenshot - Fatal编程技术网

使用SeleniumWebDriver(java)自动拍摄每个新页面的屏幕截图

使用SeleniumWebDriver(java)自动拍摄每个新页面的屏幕截图,java,selenium,webdriver,listener,screenshot,Java,Selenium,Webdriver,Listener,Screenshot,有没有一种方法可以让听者对加载的每个新页面截图?截图本身没有问题,我可以这样做,我只需要一种方式让它自动发生,这样我就不必在每次点击某个东西之前手动输入screenshto方法 我正在查看WebDriverEventListner侦听器,但如果不事先指定要单击的元素/要加载的页面,它似乎无法真正用于检测任何页面加载 是的,您可以通过在java中创建任务调度器来实现您的目标 您应该创建一个扩展TimerTask的类(在java.util包中提供)。TimerTask是一个抽象类 在要定期执行的pu

有没有一种方法可以让听者对加载的每个新页面截图?截图本身没有问题,我可以这样做,我只需要一种方式让它自动发生,这样我就不必在每次点击某个东西之前手动输入screenshto方法

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

是的,您可以通过在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();
                }
            }
    
        }
    }
    
  • 实例化定时器对象Timer time=new Timer()
  • 实例化计划任务类对象ScheduledTask st=new ScheduledTask()
  • 通过Timer.schedule()方法分配计划任务

    导入java.util.Timer

    //主类 公共类调度{ 公共静态void main(字符串args[])引发InterruptedException{ Timer time=new Timer();//实例化Timer对象 TakeScreenShot=新的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
            }
    
    
        }
    }
    
    }

  • 注意:-如果您的代码不包含终止符,它将不会停止。因此您应该使用程序终止符。

    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();
                }
            }
    
        }
    }
    
  • 您可以按如下方式在类中调用SchedulerMain:-

    字符串ags[]=null; 主时间表(ags)


  • 您可以通过以下方式更轻松地实现这一点:

    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
    beforecnavigateTo
    beforeFindBy
    afterFindBy
    。这些方法将在相应的操作后自动调用,例如:
    beforefinddby
    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,并在页面标题更改时拍摄屏幕截图

    希望这能帮助你…如果你需要任何进一步的帮助,请回来