在我的学习曲线中,我一直在寻找正确的方法来等待加载元素,并在google上获得大量页面。
归结为2,但在我的观点中,Method2(ExpectedConditions.ElementIsVisible)更优雅,并且当您同意或有更好的方法时,方法1正在尝试实现什么?
方法1
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
方法2
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
var element = wait.Until(ExpectedConditions.ElementIsVisible(by));
return element;
}
如果" NoFoundElement异常被抛出,是否已经处理或者我应该忽略它会发生什么建议或改进?
答案 0 :(得分:0)
我会说是,"方法2"是这样做的首选方式。仅仅因为如果某些内容已经在WebDriver中实现,那么您无需在测试框架中重新实现它。
关于NotFoundException
的问题:如果在指定的超时后仍未满足您等待的条件,则WebDriverWait
将提升WebDriverTimeoutException
}。根据您要等待的条件,WebDriverTimeoutException
将有一个内部异常,其中包含更多详细信息。例如,如果您使用ExpectedConditions.ElementIsVisible(By.Id("myid"))
并且该元素根本无法找到,则内部异常将为NoSuchElementException
。如果元素可以定位但在给定的超时后不可见,那么您只需获得WebDriverTimeoutException
。
根据您想要做的事情,一旦您确定该元素是"那么",您也可以使用不同的ExpectedConditions
。如果您正在等待的元素是一个按钮,并且您想要单击它,则可以使用ExpectedConditions.ElementToBeClickable
,因为这不仅会等待元素加载到DOM中并且可见,而且还等待使元素得到启用。