0

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

例如:在当前实现中,我有一个这样标识的元素: [FindsBy(How = How.LinkText, Using = "Authenticate")] private 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 以便测试可以处理失败?

4

2 回答 2

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.");

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

于 2019-02-22T18:43:00.807 回答
0

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

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

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

于 2019-02-21T22:30:59.403 回答