【问题标题】:Removing PageFactory from design C#从设计 C# 中删除 PageFactory
【发布时间】:2019-02-21 19:18:28
【问题描述】:

我们有一个现有的 C# UI 自动化框架,并且基于我们使用 PageFactory 初始化页面文件中的元素时的知识。最近我阅读了有关该主题的更多内容,并且在 C# 中使用 PageFactory 似乎没有真正的好处,因此我尝试使用字段来重写页面。我现在遇到的一件事是让我的扩展方法起作用。

例如:在当前的实现中,我有一个这样标识的元素: [FindsBy(How = How.LinkText, Using = "Authenticate")] 私有 IWebElement BstHomePageHeader;

    public IWebElement getBstHomePageHeader()
    {
        return BstHomePageHeader;
    }

有一个辅助方法可以检查元素在某些情况下是否存在,并且在测试中这样调用它:

home.getBstHomePageHeader().DoesElementExist().Should().BeTrue("用户没有被带到主页。"​​);

“DoesElementExist”方法中的代码应用了 5 秒等待,持续验证 element.Displayed 检查,它忽略了 NoSuchElementException、ElementNotVisibleExpection 和 WebDriverTimeoutException。如果元素在 5 秒内没有返回,则向主调用返回 false 并抛出流利的断言消息。

当我删除 PageFactory 时,现在创建的元素如下所示(在同一个页面文件中): public IWebElement getBstHomePageHeader => driver.FindElement(By.LinkText("Authenticate"));

如果我尝试对它应用相同的辅助方法,如下面的代码行的 DoesElementExist 部分不再适用。 NoSuchElementException 直接在我的页面文件中抛出,因此不会返回流利的断言消息。 home.getBstHomePageHeader.DoesElementExist().Should().BeTrue("用户没有被带到主页。"​​);

在非 PageFactory 设计中是否可以不让页面类抛出 NoSuchElementException 以便测试可以处理失败?

【问题讨论】:

    标签: c# selenium page-factory


    【解决方案1】:

    好吧,无论如何,我想出了一个不同的解决方案。我不确定它是不是最好的,但我相信它会起作用。在我的页面文件中,我正在查找元素: public IWebElement getBstHomePageHeader => LookUpElement(By.LinkText("Authenticate")); 我创建了一个基类,它承载 LookUpElement 方法,看起来像 protected IWebElement LookUpElement(By locator) { try { return wait.Until(driver => driver.FindElement(locator)); } catch (NoSuchElementException) { } catch (ElementNotVisibleException) { } catch (WebDriverTimeoutException) { } return null; }

    等待逻辑和之前一样。唯一的其他变化是我改变了我在测试中提出问题的方式。现在看起来像这样 if (home.getBstHomePageHeader == null) false.Should().BeTrue("User was not taken to the home page."); test.Log(Status.Pass, "User is on the home page.");

    所以,我想我并没有真正回答我自己的原始问题,但这种解决方法似乎有效。我们将在如何提问方面进行一些重写。

    【讨论】:

      【解决方案2】:

      在 java 中,您会向调用者抛出异常。你能用 C# 做到这一点吗?

      这看起来可能会有所帮助:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/creating-and-throwing-exceptions

      旁注:我们也从代码库中删除了页面工厂容器,它更加简洁。每个页面类在类的顶部包含其自己的必需元素和选择器。我们还注意到容器的陈旧元素异常,即使设置正确也是如此。

      【讨论】:

      • 感谢您的评论。从属性获取器中抛出异常并不是真正的最佳实践,所以我认为这不是一个解决方案。如果是这种情况,我将不得不将它们全部更改为方法,这是我试图避免的,但这仅仅是因为我在 C# 世界中阅读/看到的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2017-02-07
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多