运行 在 cucumber / selenium 测试中打开浏览器一次,然后 运行 所有场景示例,然后 运行 然后关闭浏览器

Run step to open browser in cucumber / selenium test once before running all scenario examples then run step to close browser afterwards

对于措辞不当的问题深表歉意。我是测试自动化和 selenium / cucumber BDD 的新手,我正在尝试创建一个演示项目,该项目使用 google 运行s 一些数学表达式并验证结果。我想使用场景大纲所以有..

Scenario Outline: Enter a maths expression
    Given User enters the maths expression <expression>
    When the user clicks the Search button
    Then The result of <expectedResult> is returned  
Examples: 
    | expression | expectedResult |
    | 4+4 | 8 | 
    | 5^3 | 125 |  

我按照自己的步骤打开 chrome 浏览器并在 @Before 方法中导航到 google,例如 ..

@Before
public void setup() throws Throwable {
    System.setProperty("webdriver.chrome.driver","C:\xxx\chromedriver.exe");
    this.driver = new ChromeDriver();
    this.driver.manage().window().maximize();
    this.driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
    this.driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS);
    driver.get("https://google.com");
    Thread.sleep(2000);
    //agrees to the terms and conditions
    driver.findElement(By.xpath("//*[@id=\"L2AGLb\"]/div")).click();
}

当我 运行 我的功能有效时,但对于场景大纲中的每个示例,它 运行 是之前的步骤(这似乎是在线阅读的预期行为),即浏览器打开和关闭对于每个示例。

理想情况下,我希望浏览器在开始时打开一次,运行 通过所有示例,然后在结束时关闭。是否有适当的方法注释可用于实现此目的。我试图在网上找到答案,但运气不佳。一个 post 提到使用 @BeforeSuite 但我只是为了在尝试使用它时出错。我也尝试使用 @Background 注释,但这对每个场景示例都做了同样的事情 运行s。

如有任何帮助,我们将不胜感激。

你的说法是正确的。 Cucumber Hook @Before 将在每个场景的第一步之前执行使用此注释标记的方法 [参见:Cucumber Reference]。显然,如果您不想在每个场景前后打开和关闭浏览器,那么您就不能在此处添加该代码。不幸的是,Cucumber 没有像 JUnit 或 TestNG 那样挂钩到 运行“Before Suite”。因此,您不能像在那些单元测试平台上那样 运行 之前或之后的事情。

我使用的一个技巧是初始化驱动程序,然后将其作为全局变量存储在实用程序中 class。这样,我可以在整个测试会话中重复使用同一个实例。此外,您可以创建一个 init 场景和 运行 来创建您的场景。

@StartBrowser
Scenario: Start browser session
  When I initialize driver
  Then open browser

在代码中...

public class BrowserInitStepDefinitions {
    @When("I initialize driver")
    public void initializeDriver() {
        System.setProperty("webdriver.chrome.driver","C:\xxx\chromedriver.exe");
        WebDriverUtils.setDriver(new ChromeDriver());
    }

    @Then ("open browser")
    public void openBrowser() {
        WebDriver driver = WebDriverUtils.getDriver();
        driver.get("https://www.yourwebsite.com");
    }

    @Then ("close browser")
    public void closeBrowser() {
        WebDriver driver = WebDriverUtils.getDriver();
        driver.quit();
    }
}
public class WebDriverUtils {
    private static WebDriver driver;
    public static void setDriver(WebDriver webDdriver) {
        if (driver == null) {
            driver = webDdriver;
        }
    }
    public static WebDriver getDriver() {
        if (driver == null) {
            throw new AssertionError("Driver is null. Initialize driver before calling this method.");
        }
        return driver;
    }
}

最后,调用场景时,记得先包含这些场景。

@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty", "html:target/cucumber-report.html"},
        features= "features",
        glue= {"whatever"},
        tags= "@StartBrowser or @MyTest1 or @MyTest2"
        )
public class TestRunner {
    // code omitted
}

您可以(而且很可能应该)创建一个场景来关闭您的浏览器并回收您在执行测试期间可能使用的所有资源。