Java 如何在WebDriverWait超时之前添加日志

Java 如何在WebDriverWait超时之前添加日志,java,selenium-webdriver,webdriver,selendroid,Java,Selenium Webdriver,Webdriver,Selendroid,我使用selendroid来测试混合应用程序。我有自己的日志记录器,它记录并使用WebDriverWait等待特定的行为。我的问题是,在WebDriverWait失败并引发timeoutException之前,我如何使用我的记录器?首先,我对selendroid一无所知 一个简单的解决方案可以是: public void waitForCondition(WebElement element){ try{ new WebDriverWait(driver, 60)

我使用selendroid来测试混合应用程序。我有自己的日志记录器,它记录并使用WebDriverWait等待特定的行为。我的问题是,在WebDriverWait失败并引发timeoutException之前,我如何使用我的记录器?

首先,我对selendroid一无所知

一个简单的解决方案可以是:

public void waitForCondition(WebElement element){
    try{
        new WebDriverWait(driver, 60)
                .until(ExpectedConditions.visibilityOf(element)); // your condition
    } catch (TimeoutException e){
        // do log or whatever
    }
}
无论如何,您通常通过实现并向注册,然后调用它,如:

EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(new FirefoxDriver());
MyWebDriverEventListener listener = new MyWebDriverEventListener();
eventFiringWebDriver.register(listener);
其中
MyWebDriverEventListener
类似于

class MyWebDriverEventListener implements WebDriverEventListener {
            // .. skipped
}
if (throwable instanceof TimeoutException){
    // log
}
因此,基本上,
WebDriverWait
until
方法所做的就是执行
driver.findElement
直到:

重复将此实例的输入值应用于给定函数,直到出现以下情况之一:

  • 函数既不返回null也不返回false
  • 函数抛出一个未忽略的异常
  • 超时过期
  • 当前线程被中断
因此,您可以做的是实现登录
WebDriverEventListener

public void afterFindBy(By by, WebElement element, WebDriver driver) {
    // Do logging 
}
这将在每次找到元素时应用(不仅是等待,还包括常规的driver.findElement)。无论如何,这不包括抛出异常的情况。您还可以使用以下方法登录
onException
方法

class MyWebDriverEventListener implements WebDriverEventListener {
            // .. skipped
}
if (throwable instanceof TimeoutException){
    // log
}
我不会这么做,但这是你的密码

也就是说,我通常不会这样做,因为我不关心这样详细的日志级别,我只有2个助手方法可以处理我需要的所有等待:

public void waitUntil(WebElement element) {
    new WebDriverWait(driver, 60)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class)
            .until(ExpectedConditions.visibilityOf(element));
}

public void waitUntil(List<WebElement> elements) {
    new WebDriverWait(driver, 60)
            .ignoring(NoSuchElementException.class)
            .ignoring(StaleElementReferenceException.class)
            .until(ExpectedConditions.visibilityOfAllElements(elements));
}

WebDriverWait有一个消息属性,您可以设置失败消息

最好在静态类中封装Wait函数,如下所示(您可以避免一直创建WebDriverWait对象),并设置消息:

private static IWebDriver activeDriver;
private static WebDriverWait activeWait;
public static WebDriverWait Wait(this IWebDriver driver, string message = "Test has timed out while finding a UI element")
{
    if (driver != activeDriver)
    {
        activeDriver = driver;
        try
        {
            activeWait = new WebDriverWait(driver, timeout);
        }
        catch (Exception)
        {
            throw Exception(message);
        }
    }
    activeWait.Message = message;

    return activeWait;
}
要调用上面的等待包装器(因为它是作为扩展方法编写的):

如果您想要最简单的形式(无包装等):


我使用以下代码尝试了使用EventFiringWebDriver的解决方案:driver=new SelendroidDriver(caps);EventFiringWebDriver EventFiringWebDriver=新的EventFiringWebDriver(驱动程序);注册(新的MyWebDriverEventListener());其中MyWebDriverEventListener是您答案中的侦听器。事实上我没有看到任何日志,你知道问题出在哪里吗?事实上没有。我将System.out.println放在每个回调中,看起来代码没有到达任何回调,请检查我的编辑。如果它不工作,可能是selendroid的问题。
var webDriverWait = new WebDriverWait(driver, timeout);
webDriverWait.Message = "Your message when exception is thrown";