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

本文关键字:元素 下一个 继续 请选择 WebDriver 如果 存在 Selenium 如果没有 | 更新日期: 2023-09-27 18:30:44

我刚刚完成一个测试脚本并访问一个相当动态的页面。有问题的页面出现一个元素(通常是单选按钮或复选框),该元素仅在满足先前页面中的某些条件时才存在。因此,我的测试将访问此页面与以前的标准无关,我想在处理这些元素"IF"时点击页面底部的"继续"元素。我有几个方法可以按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");
                }

我正在尝试在此代码中处理如果出现单选按钮,请选择它,然后选择继续按钮。此外,如果未显示单选按钮,请忽略它并选择继续按钮。任何这方面的帮助将不胜感激。

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

尝试这样的事情:

//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;
}

您不会收到任何异常,然后测试可以继续。

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

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

这样,你的 if 语句将被if (radioOptions.size()!=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
}