我对这个仪器概念完全陌生。我有一个自定义jar文件,它有很多方法。让我们假设现在我有启动和停止方法。为了收集开始和停止指标,我需要在每次点击后调用这些方法。而不是这样做是有一种方法来衡量这一点。我希望在运行时之前和之后动态调用所有可点击元素的方法。对此的任何建议都会很棒。提前致谢。请找到示例代码。
自定义方法:
Public void start (){
long start = System.currentTimeMillis();
}
public void stop{
long finish= System.currentTimeMillis();
long totalTime = finish - start;
}
示例代码:
start();
driver.findElement(By.name("username")).sendkeys("@@@");
stop();
start();
driver.findElement(By.name("password")).sendkeys("@@@");
stop();
start();
driver.findElement(By.name("login")).click();
stop();
答案 0 :(得分:2)
这是一个使用ByteBuddy的示例测量解决方案,尽管正如我在此问题的评论中所提到的,它可能不是解决此问题的最佳方法。
对于这个简单的例子,代码仅涵盖WebDriver和WebElement上的调用被链接的情况,例如:
driver.findElement(By.name("login")).click();
driver.findElement(By.name("logout")).click();
如果没有额外的编码,下面的片段将无法使用:
WebElement element1 = findElement(By.name("login"));
WebElement element2 = findElement(By.name("logout"));
element2.click();
element1.click();
仪表代码:
public class ByteBuddyTest {
public static void main(String[] args) throws Exception {
ByteBuddyAgent.install();
new ByteBuddy()
.redefine(RemoteWebDriver.class)
.visit(Advice.to(WebDriverAdvice.class).on(named("findElement").and(takesArguments(1))))
.make()
.load(ByteBuddyTest2.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
new ByteBuddy()
.redefine(RemoteWebElement.class)
.visit(Advice.to(WebElementAdvice.class).on(named("click")))
.make()
.load(ByteBuddyTest2.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
InternetExplorerDriver driver = new InternetExplorerDriver();
driver.get("<some webpage>");
driver.findElement(By.id("<some_id>")).click();
}
public static class WebDriverAdvice {
@Advice.OnMethodEnter
public static void enter(@Advice.Origin String method) {
System.out.printf("Driver Method Enter: %s\n", method);
Times.start = System.currentTimeMillis();
}
}
public static class WebElementAdvice {
@Advice.OnMethodExit
public static void exit(@Advice.Origin String method, @Advice.This Object target) {
System.out.printf("Element Method Exit: %s\n", method);
System.out.println("Time: " + (System.currentTimeMillis() - Times.start));
}
}
public static class Times {
public static long start = 0L;
}
}
使用WebDriverEventListener的示例
public class WebDriverEventListenerTest {
public static void main(String[] args) throws Exception {
InternetExplorerDriver driver = new InternetExplorerDriver();
EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
eventDriver.register(new EventHandler());
eventDriver.get("<some webpage>");
eventDriver.findElement(By.id("<some id>")).click();
eventDriver.findElement(By.id("<some id>")).click();
}
public static class EventHandler extends AbstractWebDriverEventListener {
@Override public void beforeFindBy(By by, WebElement element, WebDriver driver) {
System.out.printf("Driver Find By: %s\n", by);
Times.start = System.currentTimeMillis();
}
@Override public void afterClickOn(WebElement element, WebDriver driver) {
System.out.printf("Element Method Exit: %s\n", element);
System.out.println("Time: " + (System.currentTimeMillis() - Times.start));
}
}
public static class Times {
public static long start = 0L;
}
}
答案 1 :(得分:0)
您似乎正在尝试对代码进行基准测试。如果是这样,我建议使用基准框架,例如Google Caliper,它可以帮助仪器代码,同时在名义上影响代码的实际性能,并且还有助于解释JIT编译等,这可能会改变执行时间代码的方法重复执行。