【问题标题】:Selenium WebDriver - If element present select it, if not ignore it and continue to next elementSelenium WebDriver - 如果元素存在选择它,如果不忽略它并继续下一个元素
【发布时间】:2016-10-03 22:27:55
【问题描述】:

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

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

【问题讨论】:

  • 太好了,你已经解释了你正在尝试做什么,你现在正在做什么,但是你还没有解释为什么现在这不起作用?这段代码有什么作用?你期待它做什么?
  • 我是新手,因为您还处于某个阶段。目前我已经设置了一个正在返回的“没有这样的元素”异常,链接到“Radio_Button_Id”。如果元素不存在,这会在代码 sn-p 的开头标记。我期待代码查找元素,如果不存在则忽略它,如果存在则捕获并选择它>然后选择“继续”。
  • 你的想法是正确的......尝试实现它:)

标签: c# selenium webdriver selenium-webdriver


【解决方案1】:

试试这样的:

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

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

【讨论】:

  • 调整了上述结构以适应我的方法,并创建了一个包含此结构的新方法以供将来参考(如果我在其他地方遇到相同的事件)。工作一种享受!
  • 我知道这很旧,但我只是遇到了它,你可以做一些简单的事情来减少代码量并提高效率,所以我更新了答案。它仍然以相同的方式工作。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我还用它来测试元素是否存在,如果存在则获取元素的句柄:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多