我们是否应该为带有选择下拉菜单的弹出窗口编写单独的页面对象?

Should we write separate page-object for pop-up with a selection drop-down?

我不熟悉使用 selenium 和 java 的页面对象模型自动化。我正在使用页面对象模型并将每个页面作为单个 class 并将该页面中的操作作为方法。 我们是否应该为提交表单时出现的简单弹出窗口编写单独的页面对象。此弹出窗口用于 select 服务类型,接下来将根据 selection 正确的表格打开。我有 'page objects' 用于此弹出前后的页面。但是对于这个,我只是插入了一个直接代码到 select 一个选项,然后单击下一步按钮。我应该为此弹出窗口创建一个单独的页面对象 class 吗?(因为这不是页面)。弹出窗口有 3 个选项和一个下一步按钮以继续。

如果弹出窗口有一个 ID 定位器,并且很可能出现在其他网页上,我会把它放在它自己的页面对象中,但通常弹出窗口直接绑定到当前页面并且会因此最好包含在该页面的对象定义中。

我考虑将它放在单独的页面对象中的唯一原因是,如果它确实在其他页面中使用并使用了相同的 ID 定位器,就好像当该定位器发生变化时,您只需编辑一个页面对象,而不是定位和修复所有其他也引用该弹出窗口的页面对象。

请阅读this Martin Follower's article - Page Object

引用:

Despite the term "page" object, these objects shouldn't usually be built for each page, but rather for the significant elements on a page

想象一个页面有十几个选项卡、面板等,每个都有几个字段、按钮等。为这样的页面创建一个巨大的 class 是不切实际的,它肯定会有 300-500 行或更多代码。这样的class很难维护。

最好(在我看来)创建几个小 classes(页面对象),每个用于页面的特定部分,每个只包含几个元素,每个不超过 50-100 行代码。我们称这些 classes page fragments 而不是 page objects,但概念是一样的。

但因人而异,每个人对这个话题可能会有不同的看法。

我同意 Bill 的观点,但是我处理弹出窗口的方式有点不同。如果它是特定于页面的弹出窗口,我将它作为自己的页面对象放在同一个 class 中。

例如,如果您的仪表板页面上有一个特定于仪表板页面的弹出窗口,但在 Web 应用程序的其他任何地方都找不到,我将其设为自己的 class 在仪表板页面对象中.

我这样做的原因是,当应用程序的特定区域 "containerized" 在它们自己的对象中时,我发现测试的可读性要高得多。然后当你打开弹出窗口并对其进行操作时,它们看起来像 "popup.SetValue" 与 "dashboard.SetValue" 或类似的东西。这样做你就知道你是在弹出窗口上进行操作而不是在仪表板上进行测试。

如果弹出窗口在您的应用程序中广泛存在并且可以轻松重复使用,我建议将其放入自己的页面对象中。

确实没有硬性规定。正如其他人所说,页面对象不一定是页面。它实际上应该是任何可重用的功能,例如对话框或页眉或页脚等。对于我编写的自动化,我决定遵循任何对话框都是一个单独的页面对象(实际单独的文件)的规则。我发现它可以帮助我跟踪 pages/dialogs 等

为了进一步帮助解决这个问题,我将我的 classes 命名为 *Page 表示页面(例如 LoginPage.cs),*Dialog 表示对话框(例如 AddImageDialog.cs),*Panel 表示面板(例如HeaderPanel.cs),等等。

如果对话框仅存在于特定页面上,我会根据基页名称对其进行命名,例如ProductDetailsPage_AddImageDialog.cs。这样做的目的是当我查看文件列表时,它们将按字母顺序排序,因此与产品详细信息页面相关的所有页面对象将排序在一起,这样我就可以快速查看有多少页面对象与该页面相关联以及它们是什么是。下面是一些示例。您可以浏览列表并快速确定哪些页面对象与特定页面相关联,哪些不相关。

HeaderPanel.cs
LoginDialog.cs
ProductDetailsPage.cs
ProductDetailsPage_AddImageDialog.cs
ProductDetailsPage_AddTextDialog.cs
ProductDetailsPage_SaveCompleteDialog.cs
ProductDetailsPage_SaveYourProjectDialog.cs

如果一个对话框在整个站点中多次出现(与单个页面无关),我将其命名为独立的页面对象,例如登录对话框。

我以前只是在对话框、面板等之后命名页面对象,但是当你获得 50 个页面对象后,很难记住某些对话框出现的位置,所以我想出了 _ 命名方案,它很有帮助显着。

我还考虑过在 ProductDetailsPage 页面 class 中创建 AddImageDialog 页面 class,但是当您获得包含大量对话框的更大页面时,它只会让文件变得越来越大。我更喜欢在合理的情况下保持文件大小尽可能小,同时保留所有重要的位。将文件分解为页面和对话框并将它们分开可以维护页面对象模型原则,同时保持内容更清晰……至少在我看来是这样。