WebDriverEventListener截图onException()

时间:2019-06-04 09:04:07

标签: selenium selenium-webdriver

伙计们。今天,我已经完成了对WebDriverEventListener的自定义实现。我只需要onException()方法即可创建屏幕截图。但是我遇到了问题,因为我正在使用流畅的等待。

new FluentWait<>(webDriver)
    .withTimeout(Duration.ofSeconds(10))
    .pollingEvery(Duration.ofMillis(500))
    .ignoring(NoSuchElementException.class)
    .until(someCondition)

因此,最后,我得到了每个忽略的屏幕(NoSuchElementException.class)-20个屏幕截图,其中1个失败)))。是有人遇到了这样的问题还是有人解决了?

2 个答案:

答案 0 :(得分:1)

使用.ignoring(NoSuchElementException.class)时,您不会避免引发异常,而只是忽略了该异常。发生的情况是您的FluentWait引发了异常,但是该异常被忽略(当您声明.ignoring(NoSuchElementException.class)时)。

您在这里有三个选择:

  • 如果测试失败[首选],则在测试结束时捕获屏幕。
  • 无论您在使用FluentWait还是任何其他Selenium代码的地方,都可以试用。
  • 在实现FluentWait的方法中引发事件时,请使用反射来避免捕获。

这是我们讨论过的一个想法:

private void ExceptionThrown(object sender, WebDriverExceptionEventArgs e)
{
    if (e.ThrownException is NoSuchElementException)
    {
        // Get the stack trace from the current exception
        StackTrace stackTrace = new StackTrace(e.ThrownException, true);

        // Get the method stack frame index.
        int stackTraceIndex = stackTrace.FrameCount - 1;

        // Get the method name that caused the exception 
        string methodName = stackTrace.GetFrame(stackTraceIndex).GetMethod().Name;

        if(methodName != "MyFindElement")
        {
            TakeSceenshot();
        }
    }
    else
    {
        TakeSceenshot();
    }
}

// This is an extension method of the DriverHelper interface
public IWebElement MyFindElement(this IWebDriver driver, By by, int timeOut = 0)
{
    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeOut));
    wait.IgnoreExceptionTypes(typeof(NoSuchElementException));
    // I wait until the element exist
    IWebElement result = wait.Until(drv => drv.FindElement(by) != null);
    // it means that the element doesn't exist, so we throw the exception
    if(result == null) 
    {
        MyPersonalException(by);
    }
}

// The parameter will help up to generate more accurate log
public void MyPersonalException(By by)
{
    throw new NoSuchElementException(by.ToString());
}

答案 1 :(得分:0)

这可能需要在 EventFiringWebDriver 中进行更改,因为此类没有 WebDriverWait 实例和它们的事件。如果你想避免它,在你的 EventFiringWebDriver 扩展类中创建 bool 变量并在你的 OnException 中检查这个值,如:

protected void OnException(WebDriverExceptionEventArgs e) {
            if (IsWaitHandler)
                return;

            Your actions... 
}

但这不是完美的解决方案。