使用 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.
- 您应该创建一个 class 扩展 TimerTask(在 java.util 包中可用)。 TimerTask 是一个抽象 class.
- 在 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();
}
}
}
}
- 实例化定时器对象Timer time = new Timer();
- 实例化计划任务class对象ScheduledTask st = new ScheduledTask();
通过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
}
}
}
}
注意:- 如果您的代码不包含终止,则它不会停止。所以你应该使用程序终止符。
您可以调用 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
有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,并在页面标题更改时截取屏幕截图。
希望这对您有所帮助...如果您需要任何进一步的帮助,请回来
有没有办法——也许是用一个监听器——对每个加载的新页面进行截图?截图本身没有问题,我可以做到,我只需要一种方法让它自动发生,这样我就不必在每次点击之前手动输入 screenshto 方法。
我正在查看 WebDriverEventListner
侦听器,但它似乎不能真正用于检测任何页面加载,而无需事先指定将要加载的 clicked/page 元素?
Yes you can achieve your objective by creating task scheduler in java.
- 您应该创建一个 class 扩展 TimerTask(在 java.util 包中可用)。 TimerTask 是一个抽象 class.
- 在 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();
}
}
}
}
- 实例化定时器对象Timer time = new Timer();
- 实例化计划任务class对象ScheduledTask st = new ScheduledTask();
通过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 } } }
}
注意:- 如果您的代码不包含终止,则它不会停止。所以你应该使用程序终止符。
您可以调用 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有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,并在页面标题更改时截取屏幕截图。
希望这对您有所帮助...如果您需要任何进一步的帮助,请回来