1

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

4

2 回答 2

1

首先,我对 selendroid 一无所知。

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

public void waitForCondition(WebElement element){
    try{
        new WebDriverWait(driver, 60)
                .until(ExpectedConditions.visibilityOf(element)); // your condition
    } catch (TimeoutException e){
        // do log or whatever
    }
}

无论如何,您通常通过实现WebDriverEventListener并将其注册到EventFiringWebDriver来做到这一点,然后像这样调用它:

EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(new FirefoxDriver());
MyWebDriverEventListener listener = new MyWebDriverEventListener();
eventFiringWebDriver.register(listener);

MyWebDriverEventListener类似的东西在哪里

class MyWebDriverEventListener implements WebDriverEventListener {
            // .. skipped
}

所以,基本上WebDriverWait'suntil方法在做什么,是它正在执行driver.findElement直到:

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

  • 该函数既不返回 null 也不返回 false,
  • 该函数抛出一个未被忽略的异常,
  • 超时到期,
  • 当前线程被中断

所以你可以做的是实现你的登录WebDriverEventListener

public void afterFindBy(By by, WebElement element, WebDriver driver) {
    // Do logging 
}

这将在每次找到元素时应用(不仅等待,而且还有常规的 driver.findElement)。无论如何,这不包括抛出异常的情况。您也有机会登录onException方法,使用类似

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));
}

在那里添加日志记录将是微不足道的。


编辑:我有以下解决方案工作:

public class Demo {

    @Test
    public void testEventFire(){
        EventFiringWebDriver firingWebDriver = new EventFiringWebDriver(new FirefoxDriver());
        firingWebDriver.register(new MyListener());
        try {
            firingWebDriver.navigate().to(new URL("http://www.google.com"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    private static class MyListener extends AbstractWebDriverEventListener {
        @Override
        public void beforeNavigateTo(String url, WebDriver driver) {
            System.out.println("beforeNavigateTo");
        }

    }
于 2014-08-14T08:11:12.230 回答
0

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

将 Wait 函数包装在像这样的静态类中是个好主意(您可以避免一直创建 WebDriverWait 对象)并设置 Message:

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;
}

要调用上面的 Wait 包装器(因为它是作为扩展方法编写的):

YourDriverObject.Wait("Your failure message").Until(ExpectedConditions);

如果你想要最简单的形式(没有包装等):

var webDriverWait = new WebDriverWait(driver, timeout);
webDriverWait.Message = "Your message when exception is thrown";
于 2015-05-31T01:41:53.987 回答