在不打开新的Web浏览器的情况下,在“Selenium Cucumber with Java”中测试不同的场景

时间:2016-05-09 11:04:05

标签: selenium selenium-webdriver webdriver cucumber cucumber-jvm

我有一个功能文件,我有2个场景

Feature: Login to Online Store

Scenario: Login successful with valid credentials
    Given User is on Home Page
    When User navigates to Login Page
    And User provides username and password
    Then Message displays Login successfully

Scenario: User logout successfully
    When User logouts from application
    Then Message displays Logout successfully

每次运行 RunFeatures.java 文件时,在第一个场景之后,驱动程序将打开新浏览器以执行下一个场景。 我们可以使用相同的浏览器执行第二种方案吗? 以下是我的代码:

RunFeatures.java

package cucumbertest;

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/java/features/"
            ,glue={"steps"}
            ,dryRun=false
            ,monochrome=false)

public class RunFeatures
{
}

ClientSteps.java:

package steps;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import cucumber.api.java.en.*;
import pages.HomePage;
import pages.LoginPage;

public class ClientSteps
{
    WebDriver driver=new FirefoxDriver();
    @Given("^User is on Home Page$")
    public void user_is_on_Home_Page() throws Throwable {
        new HomePage(driver).user_is_on_Home_Page();
    }

    @When("^User navigates to Login Page$")
    public void user_navigates_to_Login_Page() throws Throwable {
        new HomePage(driver).user_navigates_to_Login_Page();
    }

    @When("^User provides username and password$")
    public void user_provides_username_and_password() throws Throwable {
        new LoginPage(driver).user_provides_username_and_password();
    }

    @Then("^Message displays Login successfully$")
    public void message_displays_Login_successfully() throws Throwable {
        new LoginPage(driver).message_displays_Login_successfully();
    }

    @When("^User logouts from application$")
    public void user_logouts_from_application() throws Throwable {
        new LoginPage(driver).user_Logout_from_the_Application();
    }

    @Then("^Message displays Logout successfully$")
    public void message_displays_Logout_successfully() throws Throwable {
        new LoginPage(driver).message_displayed_Logout_successfully();
    }
}

Homepage.java文件

package pages;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.When;

public class HomePage
{
    WebDriver driver;


    public HomePage(WebDriver driver)
    {
        this.driver=driver;     

    }
    public void user_is_on_Home_Page() throws Throwable {

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        driver.get("http://www.store.demoqa.com");

    }

    public void user_navigates_to_Login_Page() throws Throwable {
        driver.findElement(By.xpath(".//*[@id='account']/a")).click();
    }

}

LoginPage.java

package pages;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;

public class LoginPage
{
    WebDriver driver;
    public LoginPage(WebDriver driver)
    {
        this.driver=driver;
    }

    public void user_provides_username_and_password() throws Throwable {
        // This is to get the first data of the set (First Row + First Column)
        driver.findElement(By.id("log")).sendKeys("tri.nguyen");
        // This is to get the first data of the set (First Row + Second Column)
        driver.findElement(By.id("pwd")).sendKeys("Test@123");
        driver.findElement(By.id("login")).click();
    }


    public void message_displays_Login_successfully() throws Throwable {
        System.out.println("Login Successfully");
    }

    public void user_Logout_from_the_Application() throws Throwable {
        driver.findElement (By.xpath(".//*[@id='account_logout']/a")).click();
    }


    public void message_displayed_Logout_successfully() throws Throwable {
        System.out.println("Logout Successfully");
        driver.quit();
    }
}

4 个答案:

答案 0 :(得分:1)

作为一种好的做法,测试用例应该是原子的。自动化测试用例不应该依赖于浏览器实例,数据等的另一个测试用例。

您应该在每个测试用例之后关闭所有浏览器窗口,并再次打开浏览器作为下一个测试用例的新实例。

在stefdef文件中使用@Before和@After来实现此目的。

答案 1 :(得分:1)

由于字词限制我无法添加评论,因此请将其作为答案再次写入!这是我之前的帖子的延续。你可以试试这个。按照

替换@Given
WebDriver driver;
    @Before
    public void setUp(){
        driver=new FirefoxDriver();
    }

    @After
    public void cleanUp(){
        driver.quit();
    }
    @Given("^User is on Home Page$")
    public void user_is_on_Home_Page() throws Throwable {
        new HomePage(driver).user_is_on_Home_Page();
    }  

确保仅导入以下文件,而不是导入junit *

import cucumber.api.java.After;
import cucumber.api.java.Before;

答案 2 :(得分:0)

我尝试按照您的指示修改我的代码,但是它获得了NullPointer异常:

WebDriver driver;
    @Before
    public void setUp(){
        WebDriver driver=new FirefoxDriver();
    }

    @After
    public void cleanUp(){
        driver.quit();
    }

    @Given("^User is on Home Page$")
    public void user_is_on_Home_Page() throws Throwable {
        new HomePage(driver).user_is_on_Home_Page();
    }

例外:

java.lang.NullPointerException
    at pages.HomePage.user_is_on_Home_Page(HomePage.java:24)
    at steps.ClientSteps.user_is_on_Home_Page(ClientSteps.java:30)
    at ✽.Given User is on Home Page(Login.feature:4)

java.lang.NullPointerException
    at steps.ClientSteps.cleanUp(ClientSteps.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

答案 3 :(得分:0)

我再次无法将其添加为评论:(。 您已在setup方法中声明并实例化了驱动程序变量,这使得它仅在本地设置方法。在课程级别声明驱动程序。

WebDriver driver;
    @Before
    public void setUp(){
        driver=new FirefoxDriver();
    }

这应该有效。如果您遇到任何问题,请告诉我们,我们可能会通过环聊来解决问题。