【发布时间】:2022-09-27 20:24:05
【问题描述】:
我目前正在开发一个网络应用程序的 POM,它允许从导航栏打开模式。您所在的每个页面的导航栏都保持不变。每个模式都可以从每个页面打开。 我为每个模式定义了一个页面对象。导航栏也是一个页面对象, 返回到打开模式的页面的最佳方式是什么?
例如,您在 Page FooPage 上并打开模态 AboutModal。返回 FooPage 的最佳方式是什么?它也应该适用于 BarPage 和其他页面。
我的第一种方法是,我定义了一个 BasePage 对象,它只包括 webdriver 和导航栏。我从这个 BasePage 扩展了网络应用程序上的每个页面。然后我可以做这样的事情:
FooPage 的代码:
public class FooPage: BasePage
{
private NavigationBar NavBar;
public FooPage(IWebDriver driver): base(driver)
{
...
this.NavBar = new NavigationBar(driver);
}
public NavigationBar Navigate()
{
return NavBar;
}
...
}
public class NavigationBar
{
...
public openAboutModal(BasePage currentPage)
{
log.Info(\"Open About Modal\");
Action.Click(NavigationBarElements.AboutButton);
return new AboutModal(Driver, currentPage);
}
}
public class AboutModal
{
...
protected BasePage ReturnPage;
public AboutModal(IWebDriver driver, BasePage returnPage)
{
...
this.ReturnPage = returnPage;
}
public BasePage CloseAboutModal()
{
return this.ReturnPage;
}
...
}
这既不实用也不直观,因为在编写测试时我们必须记住我们当前位于哪个页面对象上。此外,只有 BasePage 中的方法可用,这意味着我们必须额外导航回我们想要的页面。 所以不要写
public class ModalTests
{
[Test]
public void CheckAboutModal()
{
Login() // FooPage
.Navigate() //NavigationBar
.openAboutModal() // AboutModal
.doSomeStuff() //AboutModal
.CloseAboutModal(); //FooPage
}
}
我们必须做
public void CheckAboutModal()
{
Login() // FooPage
.Navigate() //NavigationBar
.openAboutModal(new FooPage(Driver)) // AboutModal
.doSomeStuff() // AboutModal
.CloseAboutModal() // BasePage
.Navigate() //NavigationBar
.ToFooPage(); // FooPage
}
}
我怎样才能返回模态的调用页面,而不会使测试变得复杂?
-
您可能不必这样做。模态是您所在页面的一部分。 (您仍然在同一个“页面”...这通常是 JS 更改样式或附加到当前 DOM)如果模式在另一个选项卡/窗口中,您必须切换驱动程序获取它的内容。如果模态框都是相同的并且都是从导航栏触发的,您可能会考虑将它们作为导航类的一部分。 (不要把 POM 中的 \"Page\" 看得太字面意思......把它想象成 \"re-usable properties and methods\")
-
我已经将“页面”划分为可重用的组件/页面片段。将模式放在导航栏类中感觉不对,因为它不能正确模拟行为。您仍然没有“返回”到以前的状态,而是必须使用导航栏返回到您最初所在的页面(并且可能会丢失页面上未保存的更改)。但是你的方法比我的好,所以我想我会使用它,即使它感觉不对。谢谢您的回答!
标签: c# selenium pageobjects