selenium - 如何不连续重复依赖于该背景场景的 Cucumber 功能的背景场景

标签 selenium testing selenium-webdriver automated-tests cucumber

我正在使用 Cucumber 和 Selenium 为我的应用程序编写一些端到端测试。正如 Cucumber 网站上所建议的那样,我让每个场景都完全独立。但是,我的应用程序具有基于 session 的身份验证,因此每次运行新场景时,都需要登录过程才能首次访问该站点。现在我的方法是将登录场景作为所有其他场景的背景场景,如下所示:

  Background: User is Logged In
    Given I am on the login screen
    When I enter my login details
    And I click submit
    Then I should be logged in

但是,这感觉像是很多重复的“代码”。而且每个场景独立运行,需要新建一个WebDriver实例,每个场景都运行一个浏览器,感觉有点低效?

谁能首先建议我如何避免在每个其他场景中重复后台场景(如果可能),其次是否为每个场景设置一个单独的 WebDriver 实例是正确的方法?

最佳答案

首先,您的每个场景都必须登录并创建一个新 session 。这就是您为端到端测试付出的代价。对于标准登录过程,运行时的成本应该相对较小,因为大多数登录屏幕都很简单,渲染时间短,数据库访问也很少。通过尝试在场景之间共享 session 来在此处托盘和保存运行时间确实是一个非常糟糕的主意。

要开始整理你的杯子,你可以按照丹尼尔的回答,但我建议不要嵌套步骤,而是将代码提取到辅助方法并调用它。

要优雅地做到这一点,即处理具有角色和额外属性的不同用户,您需要做更多的事情。您可以在此处查看详细示例 (https://github.com/diabolo/cuke_up)。

要有效地使用它,请遵循提交历史并主要关注功能文件夹。

这有一些框架代码,允许您注册/创建用户,然后在许多不同的配置中使用它们。有一些底层代码有点复杂,它使您能够创建知道自己密码的用户,以及添加角色等其他属性。

最终结果是您可以编写一个步骤定义

Given I am registered
Given I am an admin
Given I am logged in
Given I am logged in as an admin

实现为

Given 'I am registered' do
  @i = create_user
end

Given 'I am an admin' do
  @i = create_user role: 'admin'
end

Given 'I am logged in' do
  @i = create_user
  login as: @i
end

Given 'I am logged in as an admin' do
  @i = create_user role: 'admin'
  login as: @i
end

注意:变量@i 用于将用户从一个步骤传递到下一个

您不必担心此处的重复,因为所有步骤都会调用相同的辅助方法。您可以在更广泛的上下文中使用此处显示的模式来简化您的功能/

关于selenium - 如何不连续重复依赖于该背景场景的 Cucumber 功能的背景场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56336881/

相关文章:

javascript - 如何使用 selenium webdriver 跟踪选项卡更新

c# - Selenium/C# WebDriverWait 不等待

c# - 无法将类型字符串转换为 Bool

javascript - 无法通过 FirefoxDriver 访问全局变量

python-3.x - 带有 Python 的 Selenium webdriver - driver.title 无法获得标题

javascript - 如何处理 webelement is - not attribute id(!) in javascript from selenium-python?

python - 使用 robotframework api 从 python 执行机器人关键字

javascript - ReactJS Selenium 测试

python - 模拟类方法并更改 Python 中的一些对象属性

java - 如何在 selenium webdriver 的下拉窗口中向下滚动?