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