伙计们。今天,我已经完成了对WebDriverEventListener的自定义实现。我只需要onException()方法即可创建屏幕截图。但是我遇到了问题,因为我正在使用流畅的等待。
new FluentWait<>(webDriver)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class)
.until(someCondition)
因此,最后,我得到了每个忽略的屏幕(NoSuchElementException.class)-20个屏幕截图,其中1个失败)))。是有人遇到了这样的问题还是有人解决了?
答案 0 :(得分:1)
使用.ignoring(NoSuchElementException.class)
时,您不会避免引发异常,而只是忽略了该异常。发生的情况是您的FluentWait引发了异常,但是该异常被忽略(当您声明.ignoring(NoSuchElementException.class)
时)。
您在这里有三个选择:
这是我们讨论过的一个想法:
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...
}
但这不是完美的解决方案。