【问题标题】:Implement Recursive Finding of Element (if not found) in Selenium Page Object Model在 Selenium 页面对象模型中实现元素的递归查找(如果未找到)
【发布时间】:2018-04-05 13:27:22
【问题描述】:

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

所以,基本上我想扩展 Selenium FindsBy Class 并为其添加特定属性,这允许多次跟踪 web 元素,直到实际找到它为止..

为了更好地解释它:

[FindsBy(How = How.CssSelector, Using = "li.config-btn button[class *= 'configure icon-settings']")]
private IList<IWebElement> SettingsButton;

在后端,有我的自定义逻辑处理 waitandretry 属性

最合适的做法是什么?

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

所以,基本上我需要的是

[FindsByNew(How = How.CssSelector, Using = "li.config-btn button[class *= 'configure icon-settings']", WaitRetry = 3)]
private IList<IWebElement> SettingsButton;

有什么,他们已经在提供而我不知道吗?

提前致谢

【问题讨论】:

  • 我没有正确理解要求,但我认为您发布的代码已经被 CSS 选择器处理了。
  • 你知道 Selenium 的页面对象模式吗?
  • 我知道,但该模型如何影响此实现
  • @ShobhitMaheshwari 不是 C# 用户,但尝试开箱即用的 RetryingElementLocator? seleniumhq.github.io/selenium/docs/api/dotnet/html/…
  • 我与 Selenium 合作超过 2 年,但我不知道这个 RetryingElementLocator。我认为这是我在回答中给出的 FluentWait 方法的替代方案,尽管我认为 thisRetryingElementLocator 仅忽略 NoSuchElementException 而不是我添加到流利等待方法中的其他方法。在搜索有关此定位器的更多信息时,我发现了一个包含更多信息的优秀网站:developers.perfectomobile.com/pages/…

标签: c# selenium pageobjects


【解决方案1】:

我不知道如何扩展 FindsBy 类,我不确定它是否是解决您问题的最佳方法。我正在使用流利的等待方法来实现您正在寻找的东西。这是一个单击 web 元素的示例,其中在一定的等待时间内忽略了四种类型的异常。如果在此等待时间之后未找到该元素,则会引发 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;
    });
}

【讨论】:

  • 这可能是一个非常基本的问题,但是在Until函数中返回false会导致它重试吗?
  • @rescis 是的,只要发生四个异常之一且未超过最大等待时间,此函数就会尝试定位 web 元素。
  • 我想将此功能扩展到 selenium 原始页面对象模式,所以如果我将任何自定义属性传递给类说 [WaitAndRetry],它可以让我编写任何实际等待和重试的自定义方法跨度>
  • 编辑了我的问题,可能现在这更能说明我想要什么
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 2020-10-21
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多