Проверьте, присутствует ли элемент при использовании POM - PullRequest
0 голосов
/ 11 июня 2018

У меня проблема с поиском хорошего способа проверки наличия элемента.Я использую объектную модель страницы при автоматизации моих тестовых случаев, что означает, что я объявляю все элементы в определенном классе, а не в реальных [тестах].Как я могу преобразовать этот простой метод для проверки объявленных элементов следующим образом:

private IWebElement LoginButton => driver.FindElement(By.Id("LoginButton")); 

IsElementPresent(IWebElement element)
{
   try
   {
    //Something something
   }

   catch(NoSuchElementException)
   {
   return false;
   } 

   return true;
   }

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Я думаю, вы ищете что-то простое, как

public bool ElementExists(By locator)
{
    return Driver.FindElements(locator).Any();
}

Вы бы назвали это как

if (ElementExists(By.Id("LoginButton")))
{
    // do something
}

Вы не можете передать элемент, потому что для того, чтобы передать его в, вам нужно было бы сначала найти его, что было бы невозможно (это вызвало бы исключение), если его нет.

Если вы пытаетесь проверить существующий элемент, вы можете сделать что-то вроде ниже.

public bool ElementExists(IWebElement e)
{
    try
    {
        bool b = e.Displayed;

        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
0 голосов
/ 11 июня 2018

У меня недавно была похожая проблема:

Мне удалось включить в нее стратегию / политику повторов, поэтому я жду, пока элемент будет существовать в DOM.

        public static void WaitForElementToExistInDom(Func<IWebElement> action)
        {
            RetryPolicy.Do(() =>
            {
                if (!DoesElementExistInDom(action))
                    throw new RetryPolicyException();
            }, TimeSpan.FromMilliseconds(Timeouts.DefaultTimeSpanInMilliseconds), TestConstants.DefaultRetryCount);
        }

        public static bool DoesElementExistInDom(Func<IWebElement> action)
        {
            var doesExist = false;
            try
            {
                var element = action.Invoke();
                if (element != null)
                    doesExist = true;
            }
            catch (StaleElementReferenceException)
            {
            }
            catch (NullReferenceException)
            {
            }
            catch (NoSuchElementException)
            {
            }

            return doesExist;
        }

И вы можете назвать это так:

WebDriverExtensionMethods.WaitForElementToExistInDom(() => Map.YourElement); 

Если элемент остановлен или не существует, внутренне мы собираемся обработать исключения и повторить попытку.

И посколькуоценка «если элемент существует в DOM» выполняется при получении вызова элемента из MAP, мы заключаем его в Action / Func, таким образом, оценка выполняется в методе (и, таким образом, перехватисключения), вам не нужно использовать селектор поиска вне самой карты элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...