我们应该为带有选择下拉列表的弹出窗口编写单独的页面对象吗



我是使用selenium和java实现页面对象模型自动化的新手。我使用页面对象模型,将每个页面作为一个类,并将该页面中的操作作为方法。我们应该为提交表单时出现的简单弹出窗口编写单独的页面对象吗?这个弹出窗口用于选择服务类型,根据选择,接下来将打开正确的表单。我有这个弹出窗口之前和之后的页面的"页面对象"。但对于这个,我只是插入了一个直接的代码来选择一个选项并单击下一个按钮。我应该为这个弹出窗口创建一个单独的页面对象类吗?(因为这不是一个页面)。弹出窗口有3个选项和一个"下一步"按钮。

请阅读Martin Follower的文章-Page Object。

报价:

尽管术语"页面"对象,但这些对象通常不应该是为每个页面构建,而是为页面上的重要元素构建

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

(在我看来)最好创建几个小类(页面对象),每个类用于页面的特定部分,每个类只包含几个元素,每个类的代码不超过50-100行。我们将这些类称为页面片段,而不是页对象。但概念是相同的。

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

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

例如,如果你的仪表板页面上有一个弹出窗口,它是特定于仪表板页面的页面,但在web应用程序的其他任何地方都找不到,我会在仪表板页面对象中创建它自己的类。

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

如果弹出窗口在整个应用程序中都很普遍,并且可以很容易地重用,我建议将其制作成自己的页面对象。

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

为了进一步帮助实现这一点,我将我的类命名为页面的页面(例如LoginPage:cs)、对话框的对话框(例如AddImageDialog.cs)、面板的面板(例如HeaderPanel.cs)等等

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

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

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

我过去只以对话框、面板等命名页面对象,但当你得到50个页面对象后,很难记住某些对话框发生在哪里,所以我提出了_命名方案,它起到了很大的作用。

我还考虑过在ProductDetailsPage页面类中创建AddImageDialog页面类,但当您获得具有大量对话框的较大页面时,它只会使文件越来越大。我更喜欢保持文件大小尽可能小,同时保留所有重要的部分。将文件分解为页面和对话框并将它们分开可以维护页面对象模型的原则,同时保持内容的整洁。。。至少在我看来。

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

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

相关内容

最新更新