C# 在Selenium页面对象模型中实现元素(如果未找到)的递归查找
我正在我的自动化框架中实现Selenium页面对象模式,并且将再次测试的网站有点不稳定 因此,基本上我想扩展Selenium FindsBy类,并为此添加特定属性,从而允许对webelement进行多次跟踪,直到找到它为止 为了更好地解释它: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
[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],它将允许我编写任何实际等待和重试的自定义方法来设置我的问题,可能现在这更符合我的要求