C# 在Selenium页面对象模型中实现元素(如果未找到)的递归查找

C# 在Selenium页面对象模型中实现元素(如果未找到)的递归查找,c#,selenium,pageobjects,C#,Selenium,Pageobjects,我正在我的自动化框架中实现Selenium页面对象模式,并且将再次测试的网站有点不稳定 因此,基本上我想扩展Selenium FindsBy类,并为此添加特定属性,从而允许对webelement进行多次跟踪,直到找到它为止 为了更好地解释它: [FindsBy(How = How.CssSelector, Using = "li.config-btn button[class *= 'configure icon-settings']")] private IList<IWebElemen

我正在我的自动化框架中实现Selenium页面对象模式,并且将再次测试的网站有点不稳定

因此,基本上我想扩展Selenium FindsBy类,并为此添加特定属性,从而允许对webelement进行多次跟踪,直到找到它为止

为了更好地解释它:

[FindsBy(How = How.CssSelector, Using = "li.config-btn button[class *= 'configure icon-settings']")]
private IList<IWebElement> SettingsButton;
[FindsBy(How=How.css选择器,使用=“li.config-btn按钮[class*=”配置图标设置“]”)
私人IList设置按钮;
在后端,有我的自定义逻辑处理waitandretry属性

做这件事最合适的方法是什么

既然FindsBy类是密封的,您不能继承它,那么我如何扩展FindsBy功能并实现我的东西呢

所以,基本上我需要的是

[FindsByNew(How = How.CssSelector, Using = "li.config-btn button[class *= 'configure icon-settings']", WaitRetry = 3)]
private IList<IWebElement> SettingsButton;
[FindsByNew(How=How.css选择器,使用=“li.config-btn”按钮[class*=“configure icon settings]”,WaitRetry=3)]
私人IList设置按钮;
他们是否已经提供了我不知道的东西


提前感谢

我不知道如何扩展FindsBy类,我不确定这是否是解决您问题的最佳方案。我正在使用流畅的等待方法来实现您想要的。下面是一个单击webelement的示例,其中在特定的等待时间内忽略了四种类型的异常。当在此waittime之后未找到元素时,将引发TimeOutException

public static void WaitAndClick(this IWebDriver driver, IWebElement webelement)
{
    var fluentWait = new WebDriverWait(driver, Configuration.WaitTime);
    fluentWait.Until(webDriver =>
    {
        try
        {
            webelement.Click();
        }
        catch (Exception ex)
        {
            if (ex is TargetInvocationException ||
                ex is NoSuchElementException ||
                ex is InvalidOperationException ||
                ex is ElementNotVisibleException)
            {
                return false; //The function will rerun.
            }
            {
                throw; //Throw exception if it's not a type to be ignored.
            }
        }
        return true;
    });
}

我不知道如何扩展FindsBy类,也不确定它是否是解决您问题的最佳解决方案。我正在使用流畅的等待方法来实现您想要的。下面是一个单击webelement的示例,其中在特定的等待时间内忽略了四种类型的异常。当在此waittime之后未找到元素时,将引发TimeOutException

public static void WaitAndClick(this IWebDriver driver, IWebElement webelement)
{
    var fluentWait = new WebDriverWait(driver, Configuration.WaitTime);
    fluentWait.Until(webDriver =>
    {
        try
        {
            webelement.Click();
        }
        catch (Exception ex)
        {
            if (ex is TargetInvocationException ||
                ex is NoSuchElementException ||
                ex is InvalidOperationException ||
                ex is ElementNotVisibleException)
            {
                return false; //The function will rerun.
            }
            {
                throw; //Throw exception if it's not a type to be ignored.
            }
        }
        return true;
    });
}

我没有正确理解需求,但我认为您发布的代码已经由CSS选择器处理。您知道Selenium的页面对象模式吗?我知道,但该模型如何影响这一点implimentation@ShobhitMaheshwari不是C#用户,但尝试开箱即用的RetryingElementLocator?我与Selenium合作两年多了,但我不知道这个RetryingElementLocator。我认为这是我在回答中给出的FluentWait方法的一种替代方法,尽管我认为这个RetryingElementLocator只会忽略NoTouchElementException,而不会忽略我添加到fluent wait方法中的其他Exception。搜索有关此定位器的更多信息时,我发现了一个包含更多信息的优秀网站:我没有正确理解要求,但我认为您发布的代码已经由CSS选择器处理。您知道Selenium的页面对象模式吗?我知道,但这种模式如何影响这一点呢implimentation@ShobhitMaheshwari不是C#用户,但尝试开箱即用的RetryingElementLocator?我与Selenium合作两年多了,但我不知道这个RetryingElementLocator。我认为这是我在回答中给出的FluentWait方法的一种替代方法,尽管我认为这个RetryingElementLocator只会忽略NoTouchElementException,而不会忽略我添加到fluent wait方法中的其他Exception。搜索关于这个定位器的更多信息,我发现了一个包含更多信息的优秀站点:这可能是一个非常基本的问题,但是,如果在函数中返回false,直到函数导致它重试,该函数会如何处理?@RECRISES yes只要出现四个异常中的一个,并且没有超过最大等待时间,该函数就会尝试定位webelement。我想将此功能扩展到selenium原始页面对象模式,因此如果我向类传递任何自定义属性,例如[等待和重试],它允许我编写任何实际等待并重试的自定义方法。编辑我的问题,可能现在这更能说明我想要什么。这可能是一个非常基本的问题,但在函数中返回false,直到它重试为止,怎么样?@Reversis yes此函数将尝试定位webelement,只要四个异常之一urs和最大等待时间尚未过去。我想将此功能扩展到selenium原始页面对象模式,因此,如果我将任何自定义属性传递给类say[WaitAndRetry],它将允许我编写任何实际等待和重试的自定义方法来设置我的问题,可能现在这更符合我的要求