Selenium webdriver 如何使用cucumber、selenium和java创建依赖于另一个场景的场景

Selenium webdriver 如何使用cucumber、selenium和java创建依赖于另一个场景的场景,selenium-webdriver,cucumber,cucumber-jvm,cucumber-java,cucumber-junit,Selenium Webdriver,Cucumber,Cucumber Jvm,Cucumber Java,Cucumber Junit,我正在通过一些教程学习黄瓜,有些事情我不知道怎么做。。我需要创建一个依赖于另一个场景的场景(例如注销场景,在注销之前我必须先登录),那么我应该怎么做?我应该在注销场景中(在功能文件中)编写登录步骤,还是有办法在注销场景中调用整个登录场景 此外,我还需要知道我是否应该在每个场景之前设置驱动程序,并在每个场景之后退出驱动程序?查看cucumber钩子,这允许您设置全局“before”和“after”步骤,这些步骤将针对每个场景运行,而无需在功能文件中指定它们 因为它们适用于所有场景,所以非常适合于在

我正在通过一些教程学习黄瓜,有些事情我不知道怎么做。。我需要创建一个依赖于另一个场景的场景(例如注销场景,在注销之前我必须先登录),那么我应该怎么做?我应该在注销场景中(在功能文件中)编写登录步骤,还是有办法在注销场景中调用整个登录场景


此外,我还需要知道我是否应该在每个场景之前设置驱动程序,并在每个场景之后退出驱动程序?

查看cucumber钩子,这允许您设置全局“before”和“after”步骤,这些步骤将针对每个场景运行,而无需在功能文件中指定它们

因为它们适用于所有场景,所以非常适合于在每个测试开始时初始化驱动程序。它可能适合于运行您的登录,但如果您有可能遇到不涉及登录的情况,那么它就不是一个好办法(或者更进一步)。这同样适用于after场景,您可以在该场景中执行注销并关闭驱动程序。例如:

/**
 * Before each scenario, initialise webDriver.
 */
@Before
public void beforeScenario() {
    this.application.initialiseWebDriver();
}

/**
 * After each scenario, quit the web driver.
 */
@After
public void afterScenario() {
    this.log.trace("afterScenario");
        this.application.quitBrowser();
    }
/**
 * Something to do after certain scenarios.
 */
@After("@doAfterMethod")
public void afterMethod() {
    this.application.afterThing();
}
在我的示例中,我只是在before场景中启动驱动程序,并在after中关闭它,但理论上,这些before和after方法可以包含任何内容,您只需要将它们放在步骤定义类中,并用“@before”和“@after”标记对它们进行注释,如图所示

除此之外,您还可以有多个前后标记,您可以通过标记场景来调用这些标记。例如:

/**
 * Before each scenario, initialise webDriver.
 */
@Before
public void beforeScenario() {
    this.application.initialiseWebDriver();
}

/**
 * After each scenario, quit the web driver.
 */
@After
public void afterScenario() {
    this.log.trace("afterScenario");
        this.application.quitBrowser();
    }
/**
 * Something to do after certain scenarios.
 */
@After("@doAfterMethod")
public void afterMethod() {
    this.application.afterThing();
}
您可以在step defs中设置类似的内容,作为标准,它不会运行。但是,您可以使用“@doAfterMethod”标记您的场景,它将针对标记的场景运行,这对于您在测试结束时需要的常见场景(但不是所有场景)非常有用。对于在场景之前运行的方法也同样适用,只需将“@After”更改为“@before”

请记住,如果您确实使用了这些,则全局的前后(因此在本例中,驾驶员初始化和退出)将始终是第一个和最后一个要运行的操作,而任何其他前后操作都介于它们和场景之间

进一步阅读:

您可以使用设置测试相关性。您可以在场景元数据中使用
dependsOnMethods
dependsOnGroups
来设置与TestNG中相同的依赖关系,因为qaf BDD是TestNG BDD实现。

不支持创建依赖于JVM中其他场景的场景。我认为在Cucumber的Ruby实现中仍然支持。然而,这是一种危险的做法。Cucumber的未来版本不支持从其他场景调用场景

也就是说,当您想要重用功能时,如何解决您的问题?提到注销,当许多场景要求用户注销状态时,您如何处理? 解决方案是在helper方法或helper类中实现需要用户注销的每个步骤调用的功能

这允许每个场景独立于所有其他场景。这反过来将允许您以随机顺序运行场景。我认为不能保证场景的执行顺序。我肯定知道,有人讨论过让JUnit runner以随机顺序运行场景,只是为了强化不让场景依赖于其他场景的习惯


您的另一个问题,如何在场景之前设置WebDriver以及如何将其拆下,是使用Cucumber中的before和After钩子解决的。在使用它们时,请注意不要导入JUnit版本的Before和After。

如果您正在寻找一个解决方案,而不打开和关闭每个场景的驱动程序,请看这个-我们可以将它们与cucumber一起使用吗。。。这不需要用黄瓜做试验吗。。。。如果我们可以将其用于现有cucumber和JUNIT,请添加更多信息,如依赖项、示例或任何包含所有详细信息的链接。。如果您正在声明一个新项目,您不需要任何cucumber依赖项,请参阅。如果已有测试,请参阅。thanks@user861594 ... 我将大胆尝试,并让你知道我的经验。。投票支持你:)