有没有办法 - 也许有一个听众 - 来截取每个加载的新页面?截取屏幕本身没有问题,我可以这样做,我只需要一种方法让它自动发生,所以我不必在每次点击某些内容之前手动输入screenshto方法。
我正在查看WebDriverEventListner
侦听器,但它似乎无法用于检测任何页面加载,而无需事先指定要加载的元素/将要加载的页面?
答案 0 :(得分:5)
您可以通过EventFiringWebDriver
更轻松地实现这一目标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);
通过实现WebDriverEventListener接口
创建WebDriverListener类它有很多方法,例如beforeClickOn
,afterClickOn
,beforeNavigateTo
,afterNavigateTo
,beforeFindBy
,afterFindBy
。这些方法会自动调用在相应的操作之后: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一样检查标题,并在页面标题更改时截取屏幕截图。
希望这可以帮助你...如果你需要任何进一步的帮助,请退回
答案 1 :(得分:1)
是的,您可以通过在java中创建任务计划程序来实现您的目标。
注意: - 确保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.shedule()方法分配计划任务。
import java.util.Timer;
//主要课程 公共类SchedulerMain { public static void main(String args [])throws InterruptedException { 定时器时间=新的定时器(); //实例化定时器对象 TakeScreenShot shot = new 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
}
}
}
}
注意: - 如果您的代码不包含终止,则不会停止。所以你应该使用一个程序终结器。
您可以按如下方式调用SchedulerMain类: -
String ags [] = null; SchedulerMain.main(AGS);