问题标签 [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 投票
2 回答
1247 浏览

watir - 如何避免复选框弃用的页面对象

我从一年开始就使用黄瓜,几周后我就在其中添加了 page-object-gem。当我执行测试时,我收到消息:

弃用警告
您正在commentPage.rb:23:in `block in delete_comment'中调用一个名为checkbox 的方法。
此方法在页面对象中不存在,因此它被传递给驱动程序。
此功能将在不久的将来删除。
请更改您的代码以调用正确的页面对象方法。

(我对其他情况也有同样的看法,但这个“微不足道”的例子应该更容易解释)

我寻找一种方法来避免这种情况,但这似乎很复杂。

对于测试,我正在检查一个页面,上面有一张桌子。每行显示一行,我需要检查特定行的复选框。

我在 pageObject 中的代码:

我是否需要对我的桌子进行预处理才能在测试期间使用它?

0 投票
1 回答
1095 浏览

webdriver - 我如何以一种可以普遍应用的方式在 Java 中实现 Webdriver / PageObjects / Pagefactory

这是我对应用于 Webdriver 的 PageObjects/Pagefactory 的尝试实现理解:

这些场景类实例化 PageObjects,并在其中调用方法,而浏览器设置仅在每次测试运行时调用一次。

现在的问题是:

  1. 我应该声明如下方法并调用 Pagefactory 吗?

public MyPage method() { 调用 Login() 等方法 return PageFactory.initElements(driver, MDNSLoginPage.class); }

  1. 或者,我应该从默认构造函数调用相同的 PageFactory

  2. 我的理解/实施是否正确?

0 投票
1 回答
1706 浏览

c# - Selenium PageObjects 模式和组件

将 PageObjects 模式应用于页面组件时的标准方法是什么?

举个例子,假设我正在为亚马逊产品页面上的功能编写测试。

该页面包含大量单独的功能、产品信息、查看过此内容的客户、建议的其他客户等。

我目前看到的 PageObjects 示例实际上只涵盖了如何处理功能有限的单个页面。我正在寻找的是类似于 PageObject 的东西,它代表产品页面,然后由代表每个组件的 ComponentObjects 组成。

例如:

然后在测试中我会像这样访问控件:

我以前使用过这种方法,但使用的是基于 Selenium 构建的自定义框架,允许解析子对象及其组件。我正在寻找的是开箱即​​用的 Selenium 2 和 C# 方法。

0 投票
2 回答
376 浏览

ruby - 让 Cucumber 步骤在另一个步骤中验证由页面对象设置的变量

我正在使用 Cheezy 的 PageObject 来设置一些黄瓜测试。我的所有设置都非常像 Jeff Morgan 的书“Cucumber & Cheese”。

现在我有一个页面对象“PublishPage”设置,它有一个设置变量@tag 的方法。例如我在文件 publish_page.rb

在黄瓜步骤中,我有一个步骤on_page(PublishPage).tag,然后在另一个步骤中我有on_page(PublishPage).verify_tag。在我的 env.rb 文件中,我有require 'rspec-expectations'.

问题是,当我运行此代码时,我收到一条错误消息undefined method 'include' for #<PublishPage:xxxxxx>。但是,如果我将 verify_tag 方法中的代码移动到步骤中,一切正常,除了它无权访问@tag ...

0 投票
1 回答
203 浏览

ruby - 为什么此返回“无法将 nil 转换为字符串”

我正在使用与 Jeff Morgan 的书“Cucumber & Cheese”几乎完全相同的设置,并且我有一个这样的页面对象

当我在 Cucumber 步骤中运行以下命令时,每个命令都有自己的步骤,它会说cannot convert nil to string. 我知道这与实例变量@tag 有关,但我不确定为什么。

0 投票
1 回答
91 浏览

ruby - 在抽象层中使用 Test::Unit

有没有办法从对象内部调用断言?我正在编写 Selenium 测试并使用测试单元进行断言和轻松报告。我在顶级测试(扩展 Test::Unit::TestCase 的类)和 selenium webdriver 之间有一个抽象层。我有我的抽象层负责页面上的所有项目,如果抽象层发现的东西与预期不同,我需要一种方法让顶层测试停止。如果我可以从这个抽象层内部调用一个 Test::Unit 断言,那将是理想的。如果有任何关于如何更好地实现这一点的建议,我愿意接受建议。谢谢,扎克

0 投票
2 回答
754 浏览

ruby - 为什么我的救援块不起作用?

我正在使用 selenium webdriver 并尝试让页面对象在报告测试失败之前多次查看页面。我的问题是我遇到了一个错误,我的开始救援块没有捕获到该错误。
这是错误

Selenium::WebDriver::Error::NoSuchElementError: 无法定位元素:{"method":"id","selector":"does not exist"}

0 投票
2 回答
19940 浏览

java - 如何实现可以返回不同PageObjects的WebDriver PageObject方法

我刚刚开始使用WebDriver,我正在尝试学习最佳实践,特别是使用PageObjectsPageFactory

我的理解是PageObjects应该暴露网页上的各种操作,并将WebDriver代码与测试类隔离开来。很多时候,相同的操作可能会导致导航到不同的页面,具体取决于所使用的数据。

例如,在这个假设的登录场景中,提供管理员凭据会将您带到 AdminWelcome 页面,提供客户凭据会将您带到 CustomerWelcome 页面。

因此,实现这一点的最简单方法是公开两个返回不同 PageObjects 的方法......

登录页面对象

并在测试类中执行以下操作:

或者

替代方法

login()我希望有一种更简洁的方法来公开返回相关 PageObject的单个方法,而不是重复代码。

我考虑过创建页面层次结构(或让它们实现一个接口),以便我可以将其用作返回类型,但感觉很笨拙。我想出的是以下内容:

这意味着您可以在测试类中执行以下操作:

或者

这是灵活的 - 您可以添加一个 ExpiredPassword 页面而根本不必更改login()方法 - 只需添加另一个测试并传递适当的过期凭据和 ExpiredPassword 页面作为预期页面。

当然,您可以很容易地离开loginAsAdmin()andloginAsCustomer()方法并通过调用泛型替换它们的内容login()(然后将其设为私有)。一个新页面(例如 ExpiredPassword 页面)将需要另一种方法(例如loginWithExpiredPassword())。

这样做的好处是方法名称实际上意味着什么(您可以很容易地看到有 3 种可能的登录结果),PageObject 的 API 更易于使用(没有“预期页面”要传入),但是 WebDriver代码仍在被重用。

进一步改进...

如果您确实公开了单个login()方法,则可以通过向这些页面添加标记界面来更清楚地显示可以通过登录访问哪些页面(如果您为每个场景公开一个方法,这可能不是必需的)。

并将登录方法更新为:

这两种方法似乎都行之有效,但我不确定它如何适应更复杂的场景。我还没有看到任何类似的代码示例,所以我想知道当页面上的操作会根据数据导致不同的结果时,其他人会怎么做?

或者只是复制 WebDriver 代码并为每个数据/页面对象的排列公开许多不同的方法是常见的做法吗?

0 投票
1 回答
186 浏览

python - 设计模式/ OOP:如何将操作拆分为类

我正在使用 python Page Object 进行自动化。我有一个 basePageObject(ChangePasswordPage),它还有 4 个其他子页面,它们的不同之处在于页面上的字段。所有这些更改密码页面都在同一个 URL 上运行,但它们因字段而异,这取决于用例。例如一个有,旧密码字段,另一个没有,还有一个带有安全问题和答案之类的。这就是为什么我为所有这些变体创建了不同的子类。

现在我的问题是,我必须编写一个操作,递归地尝试使用给定的密码集更改密码。我不能在子更改密码页面中编写该操作,因为该递归操作需要子类的“changePassword”操作。此外,每个子类的这种递归操作是不同的。所有子类的情况都不一样。那么哪种模式最适合这种情况。我在哪里编写这个新的递归操作,如何创建新类以及如何应用 OOP 原则。

0 投票
2 回答
259 浏览

c# - 使用 webdriver PageFactory 选择特定页面

我有一个网络项目,单击按钮导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面之一。(其中 2 个页面的 url 可能相同)

我有三个使用 PageObject 模型表示每个页面上的预期元素的类。

实际找到实际加载的页面的最佳方法是什么?是否有一种 OR 类型的等待,我可以等待三个独特的元素并获得实际加载的那个?