Selenium WebDriver - 如果元素存在选择它,如果不忽略它并继续下一个元素

时间:2013-09-10 11:34:14

标签: c# selenium webdriver selenium-webdriver

我刚刚完成一个测试脚本并访问一个相当动态的页面。有问题的页面会显示一个元素(通常是一个单选按钮或复选框),仅当满足前一页中的某些条件时才会出现该元素。因此,我的测试将访问此页面与以前的标准无关,我想点击页面底部的“continue”元素,同时处理它们出现的这些元素“IF”。我有几个方法sto点击元素ID,到目前为止有以下代码:

 // Selects the "Confirm" button
                IWebElement radioOption = mWebDriver.FindElement(By.Id("Radio_Button_Id"));
                if (radioOption.Displayed)
                {
                    this.ClickElementById("Radio_Button_Id");

                    // Clicks CONTINUE
                    this.ClickElementById("CONTINUE");
                }
                else
                {
                    // Selects CONTINUE
                    this.ClickElementById("CONTINUE");
                }

我正在尝试使用此代码来处理如果出现单选按钮,请选择它然后选择继续按钮。此外,如果没有出现单选按钮,请忽略它并选择继续按钮。对此有任何帮助将非常感激。

3 个答案:

答案 0 :(得分:9)

尝试这样的事情:

//Displayed
public static bool IsElementDisplayed(this IWebDriver driver, By element)
{
    IReadOnlyCollection<IWebElement> elements = driver.FindElements(element);
    if (elements.Count > 0)
    {
        return elements.ElementAt(0).Displayed;
    }
    return false;
}

//Enabled
public static bool IsElementEnabled(this IWebDriver driver, By element)
{
    IReadOnlyCollection<IWebElement> elements = driver.FindElements(element);
    if (elements.Count > 0)
    {
        return elements.ElementAt(0).Enabled;
    }
    return false;
}

你不会得到任何例外,然后测试可以继续。

答案 1 :(得分:1)

你说你得到了NoSuchElementExceptions。 radioOption.Displayed测试以查看元素是否在页面上可见,但如果元素甚至不存在则会抛出错误。 (元素可以存在,但不可见)

要测试是否存在元素,您需要执行mWebDriver.FindElements(注意S)。这将返回与您的选择器匹配的所有元素中的List<WebElement>,如果找不到任何元素,它将返回大小为0的列表(并且不会抛出错误)。

这样,你的if语句将是if (radioOptions.size()!=0),并将检查该元素是否存在(如果它是可见的)。

答案 2 :(得分:0)

我还使用它来测试元素是否存在并获取元素的句柄(如果存在):

namespace SeleniumExtensions
{
    public static class WebDriverExtensions
    {
        public static bool TryFindElement(this IWebDriver driver, By by, out IWebElement element)
        {
            try
            {
                element = driver.FindElement(by);

                return true;
            }
            catch (NoSuchElementException)
            {
                element = null;

                return false;
            }
        }

        public static bool IsElementEnabled(this IWebDriver driver, By by)
        {
            IWebElement element = null;

            if (driver.TryFindElement(by, out element))
            {
                return element.Enabled;
            }

            return false;
        }
    }
}

这允许代码如下:

using SeleniumExtensions;

// ...

IWebElement element = null;

if (driver.TryFindElement(By.Id("item-01"), out element)
{
    // use element
}
else
{
     // element is null
}

或者:

if (driver.IsElementEnabled(By.Id("item-01"))
{
    // item is enabled
}