使用POM时检查元素是否存在

时间:2018-06-11 13:30:26

标签: c# selenium-webdriver

我有一个问题,我找到了检查元素是否存在的好方法。 我自动化我的测试用例时使用页面对象模型意味着我声明了特定类中的所有元素,而不是实际的[测试]。我如何转换这个简单的方法来验证声明的元素,如下所示:

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

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

   catch(NoSuchElementException)
   {
   return false;
   } 

   return true;
   }

2 个答案:

答案 0 :(得分:0)

我不久前遇到过类似的问题:

管理中包含重试策略/策略,因此我等待元素存在于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); 

如果元素已停止或不存在,我们会在内部处理异常并重试。

并且因为评估&#39;元素是否存在于DOM&#39;当你从MAP调用元素时,我们会将它包装在Action / Func中,这样评估就是在方法中完成的(所以捕获异常),你不要&# 39; t必须在元素映射本身之外使用find选择器。

答案 1 :(得分:0)

我认为你正在寻找像

这样简单的东西
public bool ElementExists(By locator)
{
    return Driver.FindElements(locator).Any();
}

你会称之为

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

你不能传入一个元素,因为为了传入它,你必须首先找到它,如果它不存在则不可能找到它(它会引发异常)。 / p>

如果您要检查现有元素,可以执行以下操作。

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

        return true;
    }
    catch (Exception)
    {
        return false;
    }
}