при прогоне теста часто Selenium его не находит :
calling element: ‘By.Id: Email’ —> OpenQA.Selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
В чем может быть причина?
а вот интересно - он реально в этот момент отображается?
Попробуйте скриншот снимать перед взаимодействием и посмотрите.
Ну или пробуйте играться с ожиданиями.
Логичнее всего ждать появления лоадера не очень долгое время, я обычно использую 1-2 секунды, так как считаю, что если он появляется с большей задержкой, то это уже можно считать багом.
Если он появился, то ожидать его исчезновения. Этот таймаут должен соответствовать приемлемому времени ожидания для пользователя конкретного действия.
Если лоадер уже исчез или не появлялся, то стоить добавить ожидание visibilityOfElementLocated или elementToBeClickable, так как вероятно, что этот элемент может перерисовываться. Так можно будет еще и ошибки вида StaleElementReferenceException избежать
Хочу добавить свой ExpectedConditions для эмплицитного ожидания на С#:
public static Func<IWebDriver, IWebElement> ElementIsClickable(By by)
{
return driver =>
{
var element = driver.FindElement(by);
return (element != null && element.Displayed && element.Enabled) ? element : null;
};
}
public static void WaitAndToBeClickable(this IWebDriver driver, By by)
{
IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementIsClickable(by));
}
Но проект не компилиться, т.к почему-то мой метод ElementIsClickable() конфликтует с нативной либой
Error 165 ‘OpenQA.Selenium.Support.UI.ExpectedConditions’ does not contain a definition for ‘ElementIsClickable’
Конечно конфликтует, ведь ты вызываешь несуществующий метод.
В ExpectedConditions есть метод until(), в который надо передать твою реализацию ожидания. По крайней мере в Java так, наверное и в C# как-то так же должно быть
Об этом никто и не говорит. Поразбирайся с тем как использовать механизм ExpectedConditions.
Я в предыдущем своем сообщении написал неправильно. Метод until() находится в классе WebDriverWait, а не в ExpectedConditions. Погугли как его использовать, это не сложно. Вот, например