使用 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 中放置任何逻辑,您可能需要考虑在那里做类似的事情。