使用 LogEventListener 时出错
Getting error when using LogEventListener
我在使用 LogEventListener 时遇到错误。
当我只是打印一些东西时,例如在 beforeEvent 方法中,一切都很好,但是当我在任何方法中设置任何操作时,我得到这个错误:
java.lang.WhosebugError
at java.base/java.lang.String.replace(String.java:2173)
at com.codeborne.selenide.impl.SelenideElementDescriber.selector(SelenideElementDescriber.java:67)
at com.codeborne.selenide.impl.ElementFinder.elementCriteria(ElementFinder.java:137)
at com.codeborne.selenide.impl.ElementFinder.getSearchCriteria(ElementFinder.java:130)
at com.codeborne.selenide.impl.Alias$NoneAlias.getOrElse(Alias.java:43)
at com.codeborne.selenide.impl.WebElementSource.description(WebElementSource.java:60)
at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:81)
at jdk.proxy2/jdk.proxy2.$Proxy17.is(Unknown Source)
at com.bme.listeners.EventLogger.beforeEvent(EventLogger.java:16)
at com.codeborne.selenide.logevents.SelenideLogger.beginStep(SelenideLogger.java:121)
at com.codeborne.selenide.logevents.SelenideLogger.beginStep(SelenideLogger.java:57)
at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:81)**
代码:
public class EventLogger implements LogEventListener {
@Override
public void beforeEvent(LogEvent log) {
if(Selenide.$("path").is(visible)) {
System.out.println("Before Event");
}
}
@Override
public void afterEvent(LogEvent log) {
}
}
谁能帮我理解一下?
关于此问题的原因,我最好的猜测是调用 Selenide.$("path").is(visible)
导致生成日志事件。这会导致您的侦听器被再次调用,因此 Selenide.$("path").is(visible)
被再次调用,这会导致另一个日志事件,因此您的侦听器被再次调用,依此类推,直到堆栈溢出。但是,我没有足够的堆栈跟踪来确定。如果您可以将堆栈跟踪包含到 com.bme.listeners.EventLogger.beforeEvent
出现的第二行,我会更确定这个问题。
可能有帮助的是向您的侦听器添加一个布尔字段,记录它当前是否正在记录事件,如果调用 beforeEvent
并且此字段为 true
:[=22,则不执行任何操作=]
public class EventLogger implements LogEventListener {
private boolean isCurrentlyLoggingAnEvent = false;
@Override
public void beforeEvent(LogEvent log) {
if (isCurrentlyLoggingAnEvent) {
// Prevent recursive call.
return;
}
isCurrentlyLoggingAnEvent = true;
try {
if(Selenide.$("path").is(visible)) {
System.out.println("Before Event");
}
}
finally {
isCurrentlyLoggingAnEvent = false;
}
}
@Override
public void afterEvent(LogEvent log) {
}
}
我使用了 try
-finally
块来确保字段 isCurrentlyLoggingAnEvent
始终设置回 false
,即使从在 try
块内。
如果您打算在 afterEvent
中放置任何逻辑,您可能需要考虑在那里做类似的事情。
我在使用 LogEventListener 时遇到错误。
当我只是打印一些东西时,例如在 beforeEvent 方法中,一切都很好,但是当我在任何方法中设置任何操作时,我得到这个错误:
java.lang.WhosebugError
at java.base/java.lang.String.replace(String.java:2173)
at com.codeborne.selenide.impl.SelenideElementDescriber.selector(SelenideElementDescriber.java:67)
at com.codeborne.selenide.impl.ElementFinder.elementCriteria(ElementFinder.java:137)
at com.codeborne.selenide.impl.ElementFinder.getSearchCriteria(ElementFinder.java:130)
at com.codeborne.selenide.impl.Alias$NoneAlias.getOrElse(Alias.java:43)
at com.codeborne.selenide.impl.WebElementSource.description(WebElementSource.java:60)
at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:81)
at jdk.proxy2/jdk.proxy2.$Proxy17.is(Unknown Source)
at com.bme.listeners.EventLogger.beforeEvent(EventLogger.java:16)
at com.codeborne.selenide.logevents.SelenideLogger.beginStep(SelenideLogger.java:121)
at com.codeborne.selenide.logevents.SelenideLogger.beginStep(SelenideLogger.java:57)
at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:81)**
代码:
public class EventLogger implements LogEventListener {
@Override
public void beforeEvent(LogEvent log) {
if(Selenide.$("path").is(visible)) {
System.out.println("Before Event");
}
}
@Override
public void afterEvent(LogEvent log) {
}
}
谁能帮我理解一下?
关于此问题的原因,我最好的猜测是调用 Selenide.$("path").is(visible)
导致生成日志事件。这会导致您的侦听器被再次调用,因此 Selenide.$("path").is(visible)
被再次调用,这会导致另一个日志事件,因此您的侦听器被再次调用,依此类推,直到堆栈溢出。但是,我没有足够的堆栈跟踪来确定。如果您可以将堆栈跟踪包含到 com.bme.listeners.EventLogger.beforeEvent
出现的第二行,我会更确定这个问题。
可能有帮助的是向您的侦听器添加一个布尔字段,记录它当前是否正在记录事件,如果调用 beforeEvent
并且此字段为 true
:[=22,则不执行任何操作=]
public class EventLogger implements LogEventListener {
private boolean isCurrentlyLoggingAnEvent = false;
@Override
public void beforeEvent(LogEvent log) {
if (isCurrentlyLoggingAnEvent) {
// Prevent recursive call.
return;
}
isCurrentlyLoggingAnEvent = true;
try {
if(Selenide.$("path").is(visible)) {
System.out.println("Before Event");
}
}
finally {
isCurrentlyLoggingAnEvent = false;
}
}
@Override
public void afterEvent(LogEvent log) {
}
}
我使用了 try
-finally
块来确保字段 isCurrentlyLoggingAnEvent
始终设置回 false
,即使从在 try
块内。
如果您打算在 afterEvent
中放置任何逻辑,您可能需要考虑在那里做类似的事情。