我是使用selenium和java的Page-Object模型自动化的新手。我正在使用Page Object模型,并将每个页面作为单个类,并将该页面中的操作作为方法。 我们是否应该为提交表单时出现的简单弹出窗口编写单独的页面对象。此弹出窗口用于选择服务类型,并根据选择将打开下一个正确的表单。在此弹出窗口之前和之后,我有“页面对象”。但是对于这个我刚插入一个直接代码来选择一个选项并单击下一步按钮。我应该为这个弹出窗口创建一个单独的页面对象类吗?(因为这不是一个页面)。弹出窗口有3个选项,下一个按钮可以继续。
答案 0 :(得分:3)
请阅读this Martin Follower's article - Page Object。
引用:
尽管有" page"对象,这些对象通常不应该是 为每个页面构建,而不是为页面上的重要元素构建
想象一个页面有十几个标签,面板等,每个都有一些字段,按钮等。为这样的页面创建一个巨大的类是不切实际的,它肯定会有300-500或更多代码行。这样的课程很难维持。
我认为创建几个小类(页面对象)更好(在我看来),每个小类用于页面的特定部分,每个部分只包含几个元素,每个元素不超过50-100行代码。我们将这些类称为页面片段而不是页面对象,但概念是相同的。
但是因人而异,每个人对这个话题都有不同的看法。
答案 1 :(得分:3)
我同意比尔的观点,但是我的弹出窗口有点不同。如果它是特定于页面的弹出窗口,我将它作为同一类中的自己的页面对象。
例如,如果仪表板页面上有一个弹出窗口,该页面是特定于仪表板页面的页面,但在Web应用程序的其他任何地方都找不到,我将其设置为仪表板页面对象中的自己的类。 / p>
我这样做的原因是,当应用程序的特定区域被集装箱化时,我发现测试更具可读性。在他们自己的对象内。然后当你打开弹出窗口并对其进行操作时,它们看起来像" popup.SetValue"与" dashboard.SetValue"或类似的东西。这样做就知道你在弹出窗口上进行操作而不是测试仪表板。
如果弹出广告在整个应用程序中广泛使用,并且可以重复使用,我建议将其添加到自己的页面对象中。
答案 2 :(得分:2)
实际上没有一条硬性规则。正如其他人所说,页面对象不一定是页面。它应该是任何可重用的功能,如对话框或页眉或页脚等。对于我编写的自动化,我决定遵循任何对话框是一个单独的页面对象(实际单独的文件)的规则。我发现它可以帮助我跟踪页面/对话框等。
为了进一步帮助解决这个问题,我将我的类*页面命名为页面(例如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页面类,但是当你获得包含大量对话框的较大页面时,它只会使文件变得越来越大。我更喜欢保持文件大小尽可能小,同时保留所有重要位。将文件分解为页面和对话框并将它们分开来维护页面对象模型原则,同时保持清洁......至少在我看来。
答案 3 :(得分:1)
如果弹出窗口有ID定位器,并且很可能在其他网页上发生,我会把它放在自己的页面对象中,但弹出窗口通常直接绑定到当前页面,因此更好地包含在该页面的对象定义中。
我考虑将它放在一个单独的页面对象中的唯一原因是它是否在其他页面中使用并使用了相同的ID定位器,就好像当该定位器发生变化时,您只需要编辑一个页面对象,而不是定位和修复所有其他也引用该弹出窗口的页面对象。