【问题标题】:Selenium Page Object Model: Best way to handle Return Pages for ModalsSelenium 页面对象模型:处理模态返回页面的最佳方法
【发布时间】: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


【解决方案1】:

与其将您的测试编写为一个巨大的方法链调用,不如在您需要引用某个页面模型时使用变量。您的测试可以简单地变成:

var foo = Login();

foo.Navigate()
   .openAboutModal()
       .doSomeStuff()
       .CloseAboutModal();

// Continue your test after closing the modal
foo.SomeOtherOperation();

在这种情况下,模态不需要返回任何东西。 CloseAboutModal() 方法可以是 void 返回类型。您的测试应该了解正在使用模式的更大上下文,并适当地创建局部变量以“返回”回到主页。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多