问题标签 [pageobjects]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
38254 浏览

python - 解决循环导入语句的 Pythonic 方法?

我只是继承了一些让我感到不安的代码:有一个测试库,里面充满了与我们网站上的网页相对应的类,并且每个网页类都有方法来自动化该页面上的功能。

有方法可以点击页面之间的链接,返回链接页面的类。这是一个简化的示例:

文件 homePageLib.py:

文件 calendarLib.py:

然后,这允许脚本文件单击页面并从该方法获取对象作为返回值,这意味着脚本作者在浏览站点时不必继续实例化新页面。(我觉得这是一个奇怪的设计,但我无法确切说明原因,除了有一个名为“clickSomeLink”的方法并返回结果页面的对象似乎很奇怪。)

以下脚本说明了脚本如何在站点中导航:(我插入print page以显示页面对象如何更改)

脚本文件:

产生以下输出:

所以,我特别感到最不安的部分是from ____ import ____那些结束了的台词。这些让我觉得很糟糕,原因如下:

  1. 我一直约定将所有导入语句放在文件的顶部。
  2. 由于一个页面可能有多个链接,这会导致from foo import bar文件中多个位置出现同一行代码。

问题是,如果我们将这些导入语句放在页面顶部,则会出现导入错误,因为(根据此示例),HomePage 导入 CalendarPage,反之亦然:

文件 homePageLib.py

文件 calendarLib.py

这会导致以下错误:

(关于如何更好地格式化 python 输出的提示?)

与其延续这种风格,我想找到一种更好的方法。有没有一种 Pythonic 的方式来处理这样的循环依赖,并且仍然将 import 语句保留在文件的顶部?

0 投票
2 回答
2573 浏览

java - 如何处理 WebDriver 的 PageObjects 模式中的继承?

请任何人提出一种处理有关页面对象模式的继承的方法吗?

例如,页面对象需要共享属性和方法。

这会好的。但问题是您的 UnitTests 不扩展 SuperPage,它们扩展了 TestCase,它包含用于测试的全局属性等。

我尽量避免重复,因为我需要在 TestCase 和 SuperPage 中共享相同的东西......页面和测试只能扩展其中之一。

例如,我需要在可用的 PageObjects 和测试中使用相同的表单数据......

例子:

如果您有用于填写 html 表单的 PageObject,则需要表单字段的名称,但即使在其他 pageObjects 中也需要它们。这样您就可以扩展 SuperPage 字段名称所在的位置。它们不能从 UnitTests 提供,例如:

但另一方面,您需要在 UnitTest 方法中使用它们,因为您将它们中的不同值提供给 PageObjects。

否则,它总是会像这样使用来自 TestCase 的变量预填充 PageObjects :

0 投票
2 回答
3792 浏览

java - 如何在 PageObjects 模式中使用 WebDriver / Selenium 2 LoadComponents?

我很难习惯 WebDriver PageObject 模式。请分享您使用 PageObjects 模式和 loadableComponents 的经验和方法。

由于 PageObject 通常代表一个组件或功能,所以我首先想到我应该使用它在 load() 中实际做一些事情,看看它是否在 isLoaded() 中完成了它应该做的事情。

然后我意识到它应该只用于“加载”对象(可能是初始化),因为它是在网站周围移动的情况下,每个对象都有自己的 url。并使用 isLoaded() 来测试对象是否已准备好进行测试。

但是如果你有一个复杂的 JavaScript 订单提交器来测试,即 JS 文件上传器、基于 2 个独立部分的 JS 表单和三种订单的复合,你不要移动任何地方(关于 URL),只是元素的状态正在改变。

考虑 get() 方法。您使用交互式表单进入页面。它在页面上存在表单时加载。然后你有 form1 和 form2 对象......它们的 load() 和 isLoaded() 方法应该是什么样子,它们可以立即执行,因为它们不需要任何加载,只需测试它们的服务。

一团糟,不知道 isLoaded() 方法是否用于检查对象是否加载,或者对象是否加载并正确设置。但我想前一种方法是正确的,应该在测试中确保设置它的有效性。

设想:

文档说:

  • 可加载组件
  • 页面对象

    1. 公共方法代表页面提供的服务

      验证、上传、上传多个、取消、清除

    2. 尽量不要暴露页面的内部

      我唯一想到的是将 Driver 实例隐藏到 UnitTests 并使用 Only PageObjects 来保留 PageObjects 中的所有字段名称、css 类名称 + 为 PageObjects 提供输入数据并断言服务/功能的布尔结果

    3. 方法返回其他 PageObjects

      这是最难适应的。一个交互式表单有 4 个页面对象有点不自然。他们推荐 Form1、Form2(Form1)、Upload(Form2)、Submit(Upload),尽管我发现链接和移交对前面对象的引用非常混乱。在测试方法中对所有这些调用 get() 似乎更好。但我想它背后的想法不是将 Driver 实例暴露给测试,而是仅使用在内部使用 Driver 实例的 PageObjects

    4. 同一操作的不同结果被建模为不同的方法 我想这意味着不应该在页面对象端决定该操作的有效性,而是在测试端

0 投票
2 回答
1680 浏览

specflow - 使用页面对象模式时重用 Specflow 的步骤

我正在将 Specflow 与页面对象一起使用,并且我有很多非常相似的场景。例如:

我正在努力了解如何为“单击时...”步骤进行一步绑定。如果我遵循页面对象模式,我应该始终返回在“那么我应该...”步骤中导航到的特定页面对象。

我有一个基本步骤定义类,其中包含一个存储当前页面对象的属性。

我不想为每个场景编写一个步骤定义,因为它重用了很多我宁愿在一个方法中使用的代码。那么如何重用步骤定义并仍然使用页面对象模式呢?

谢谢。

0 投票
3 回答
2604 浏览

java - 在 Selenium 页面对象模型测试中重用登录功能

我正在探索在 Web 应用程序上使用 Selenium 2,该应用程序需要在用户使用任何应用程序之前进行身份验证。我正计划使用 JUnit 4 或 TestNG(仍在研究哪个与 Grid 2 一起使用)。我也可能打算使用 jbehave。

有没有人对我如何改进以下测试有任何建议,以便我可以在所有测试中使用成功的登录功能?我想避免在测试本身中重复登录。

测试被简化,但它会返回一个成功登录的页面对象。

谢谢

0 投票
6 回答
18987 浏览

java - Selenium 中的页面对象模型最佳实践

当您对页面对象进行建模时,您将如何处理具有表单和大约 50 个输入字段的页面?这里的最佳做法是什么?

您会创建一个页面对象并为每个输入操作编写一个单独的函数吗?或者您会编写一个函数,将参数传递给它并输入文本?

例如

或者

我可以在第一个模型中看到,在编写测试时,测试更具描述性,但是如果页面包含太多输入字段,创建页面对象变得很麻烦。

这篇文章在使用 Selenium WebDriver 构建页面对象功能自动化测试最佳实践中的 selenium 测试也很有趣

0 投票
3 回答
36876 浏览

c# - 使用 Selenium PageObject 设计模式的最佳方法是什么

我正在使用 Selenium 2 Web Driver 和 C#.Net 创建测试。在阅读了大量 Selenium 文档后,我仍然不确定如何使用 PageObject 设计模式进行测试。

许多 selenium 示例仅在 Java 中显示,.Net 的 API 绑定并不总是像人们想象的那样相似,这是由于某些语言设置的限制和标准。

在 .Net Selenium Web 驱动程序中将 PageObject 设计模式与 PageFactory 结合使用的最佳方法是什么?

最终,我希望我的 PageObjects 处理更多功能,而不是使用 PageObject IWebElements 进行 NUnit 测试。

下面是一个示例,说明我目前将如何创建我的测试。

目前,这就是我目前对 NUnit 所做的事情:

我为 selenium webdriver 设计模式找到的大多数文章和博客文章都与我发现的以前的文章相矛盾。

那么,正确的方法是什么?

最重要的是,我什至尝试了 PageObject 设计模式。

在我的登录页面内

而且,当然要展示我的 HomePage 应该如何使用它的构造函数启动:

如何在测试中有效地使用 WebDriver PageObject 设计模式。我想不通。

0 投票
3 回答
4900 浏览

java - 如何使用继承设计带有页面对象模式的 Selenium 2 测试

我们现在正在使用Selenium 2 (Webdriver) 和TestNG编写一个新的测试套件。我们的测试使用页面对象模式,我们对目前的情况非常满意。但是,我们在测试中遇到了设计问题,我们似乎无法找到一个好的解决方案。让我给你举个例子。这是我们的 LoginTestCase:

我们想扩展我们的测试,要求用户从这个测试中登录。理想情况下,我们可以这样写:

此时,用户位于 ,DashboardPage唯一需要的是在LoginTestCase.

我知道显而易见的解决方案是将该对象存储在一个变量中(在 中LoginTestCase),然后子测试用例将可以访问该变量。然而,这看起来非常难看,并且可能导致该变量的滥用。

是否有更好的解决方案或解决此设计问题的某种模式?

0 投票
3 回答
9758 浏览

python - Webdriver 是否支持 Python 的 pagefactory?

我在 Webdriver 项目站点上阅读有关页面对象和设计模式的信息,并遇到了pagefactory。它看起来不像 Python API 的 Webdriver 包含 pagefactory。这是真的?

0 投票
2 回答
2260 浏览

ruby - 使用 Ruby 的 PageObject - 在文本字段中设置文本仅适用于主文件

我正在自动化一个网站,该网站有一个页面,其中包含由单选按钮选择的选项列表。选择其中一个收音机时,会显示一个文本字段和一个选择列表。

我创建了一个文件 (test_contracting.rb),通过它我执行测试 (ruby test_contracting.rb) 和一些其他类来代表我的页面。

在我的类 ContractPage 上,我有以下元素声明:

我在 ContractPage 中创建了一个设置域配置的方法,如下所示:

当我从 test_contracting.rb 调用方法 configure_domain 时,它会选择单选按钮,但不会用值填充字段。参数正确地进入了方法。我已经使用“puts”检查了它。即使我将参数更改为像“bla”这样的通用字符串,它也不起作用。恼人的一点是,如果我在 test_contracting.rb 上调用完全相同的组件,它就可以工作。

我发现工作是在 configure_domain 方法中,实现以下内容:

然后它起作用了。

我用作参考的 PageObjects 模块的文档可以在这里找到:http ://rubydoc.info/github/cheezy/page-object/master/PageObject/Accessors#select_list-instance_method

你们对为什么页面对象自动生成的设置对象值的方法在这个范围/上下文中不起作用有任何解释吗?

顺便说一句,一位朋友用 Java 尝试过同样的事情,但也失败了。