当前位置: 首页 > 知识库问答 >
问题:

页面对象模型链接与Cucumber的小cucumber兼容吗?

汤才捷
2023-03-14

通过测试自动化的页面对象模型,我们将页面链接在一起,如下所示:

WebDriver driver = new WebDriver()
HomePage homePage = new HomePage(driver);
LoginPage loginPage = homePage.GoToLoginPage();
WelcomePage welcomePage = loginPage.Login();
etc
etc

这样做的最大好处是,如果开发人员更改主页,使其不再链接到登录页面,我可以更新我的主页类,并在运行测试之前查看所有需要更新的测试(有错误)。

然而,对于小cucumber,上面的每一行将形成一个单独的“步骤”,因此是一个单独的方法。因此,如何才能做到这一点?

将页面对象类的实例(如homePage、loginPage等)放入cross-gherkin语句持久存储(如specflow POCO或“World”)的唯一方法是什么?

共有3个答案

岳华灿
2023-03-14

我最近看到的另一个选择是将页面对象实例存储为可以从任何类访问的静态变量?

和和裕
2023-03-14

当涉及到大多数网站(可以使用网址)时,在我看来,最好的做法是简单地使用网址,而不是一个操作来获得相同的网址。

例如:

# Suggested by OP:
driver = Selenium::Webdriver.for :chrome, prefs: prefs
homepage = Homepage.new(driver)
login = homepage.go_to_login
welcome = login.log_in_as('dave4429')

# My Suggestion:
homepage = Url.new('/')
login = Url.new('/login')
welcome = Url.new('/welcome')

这意味着您可以从一个url开始,而不必在每个测试的主页上开始。您仍然可以使用您建议的方法,但它们将用于其他领域,以确保用户可以通过url以外的方式访问页面。

然而,这不是一个一站式解决方案。对于移动和桌面应用程序,您唯一的选择可能是浏览主屏幕,在这种情况下,您建议的方法肯定是您要使用的方法。

“页面对象本身不应进行验证或断言。这是测试的一部分,应始终在测试代码中,而不应在页面对象中。”-硒HQ

我给出的例子是一个非常基本的例子,我很可能会把它们包装成模块和类,以实现这样的编码:

google = Project::Pages::Google.new

google.search_for('Hello, World!')
expect(google.found_result?).to_equal(true)

编辑

除此之外,你似乎对cucumber和小cucumber的作用有误解。

每个步骤可以有多行代码,因为步骤本身是对步骤中操作的描述。

例如:

Given I am logged in as "dave4429"
When I have submitted the "Contact Us" form with the following data:
   | dave4429@example.com | David McBlaine | I want to find out more about your Data Protection services, can I talk to a staff member or get a PDF? |
Then an email should be sent to "support@example.com" with the details specified

“何时”的定义可能如下所示:

When(/^I have submitted the "Contact Us" form with the following data:$/) do |table|
  rows = table.raw
  row = rows[0]

  contact_us.fill_form({email: row[0], username: row[1], message: row[2]})
  contact_us.submit_message
  expect(browser.title).to_equal("Message Sent!")
end

这完全取决于您在定义中分解了多少步骤。

编辑#2

我也很清楚,你想做方法链接,通过联系我们。填写表格({电子邮件:行[0],用户名:行[1],消息:行[2]})。提交消息,这在使用我建议的技术时也不是不可能的,但是这个链接是否应该用于每个单独的页面,或者是否所有内容都应该包含在一个类或模块中,这个问题只能由您的需要来回答。

这只是我的观点,这将在单个类中投入太多,分解该类将允许给测试人员更多的控制,并编写更少的冗余代码。

宗翔宇
2023-03-14

好的,在询问了许多开发和测试自动化专家之后,似乎解决方案是继续链接[例如,WelcomePage WelcomePage=loginPage.loginWithValidUser(validUser)]是一条可行之路。

要跨步骤持久化页面对象实例(例如上面示例中的欢迎页面),您可以使用依赖注入工具(在Ruby的cucumber实现中创建类似于World扩展的功能)。

这里是更多信息:https://cukes.info/docs/reference/java-di

然而,大多数项目将受益于依赖项注入模块,以更好地组织代码并在步骤定义之间共享状态。

SpecFlow(.net官方实现)的更多信息:

http://specflow.org/getting-started/beyond-the-basics/

最后,我围绕这个领域创建了一个完整的博客,可能会帮助人们,因为小cucumber/页面对象交互是我非常感兴趣的一个主题:

http://www.seligmanventures.com/dev-blog/test-automation-page-object-model-with-gherkin

 类似资料:
  • 我使用Java的页面对象模式构建了各种测试自动化框架(https://code.google.com/p/selenium/wiki/PageObjects). 我发现的两大好处是: 1)当您有一个页面的实例时,您可以看到哪些方法可用(例如,键入将显示您可以从主页调用的所有操作/方法) 2) 因为导航方法(例如)返回后续页面(例如主页)的实例,所以您只需编写代码并查看代码的位置,就可以在测试中导航

  • 我使用了页面对象模型设计模式和Cucumber。为此,我创建了两个名为和的页面,但在运行脚本时,即使我已经使用pagefactory初始化webelements,也会出现空指针异常,请查看以下代码: 文摘: 登录页面: 然后我有一个类,在这里我调用上面的登录类方法。浏览器打开良好,url被命中,但当它进入l方法时,它会在第一行本身抛出异常。 我还有一个TestRunner类,其中我粘贴了我的步骤定

  • 我今天将我的serenity和cucumber测试升级到2.6.0 en cucumber 6版本。只需要更改大量程序包,并且功能文件的步骤不再链接到步骤定义。如果我的cucumberrunner的设置 但是,如果我在功能文件中查看intellij,您将无法再单击步骤以转到定义。当我运行功能文件时,我会得到以下异常: 我不确定是什么地方出了问题,因为相同的代码适用于以前的版本

  • 我们有一个复杂的多页面应用程序,单个页面上有多达100个网页元素,多个网格,动态元素等。POM模式要求页面的所有内容都封装在页面中,即在页面类中,我需要将我的定位器定义为字符串或Bys。我还应该定义与这些元素交互的公共方法。有两种处理这些交互的方法: 为每个元素和每个交互定义一个方法。例如,我有一个元素“Submit”。在我的page类中,我将创建ClickSubmit()公共方法,并在测试中调用

  • 我对cucumber相当陌生。当我注意到运行单个特性与运行整个套件(从IntelliJ)时的差异时,我只是通过创建几个测试特性来进行试验。 我注意到,当我运行单个特性时,它使用cucumber-jvm选项运行,在本例中,CucumberConfig(定义runner和cucumber选项的空白类)和runner没有被使用。但是,当我运行整个套件时,它作为JUnit测试运行,显然,在本例中,Conf

  • 我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如: 公共类欢迎页 我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开? 让我们以注销测试方法的代码为例: 案例一: 案例2: 第二个问题