gpt4 book ai didi

java - 如何使用 java Instrumentation 在运行时调用方法

转载 作者:行者123 更新时间:2023-12-02 02:19:43 27 4
gpt4 key购买 nike

我对这个仪器概念完全陌生。我有一个自定义 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();

最佳答案

这是一个使用 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;
}
}

关于java - 如何使用 java Instrumentation 在运行时调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48684392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com