My two cents to the answer by @Loudenvier
In some cases we will be using FindElement method of another IWebElement. Here is the implementation to add timeout to this method
public static IWebElement FindElement(this IWebElement element, By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
var driver = GetDriverFromElement(element);
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return element.FindElement(by);
}
private static IWebDriver GetDriverFromElement(IWebElement element)
{
var wrappedElement = element as IWrapsDriver;
return wrappedElement?.WrappedDriver ?? throw new InvalidOperationException("Cannot get driver from the element.");
}