首页 > 解决方案 > 为什么我的 IE 浏览器使用 Selenium 和 Cucumber 启动了两次?

问题描述

我正在编写非常基本的自动化测试,Selenium-Cucumber即启动IE浏览器并在最后关闭它。

问题是浏览器启动了两次。

System.out除了几条语句之外,该测试没有太多内容。我对selenium基于两者的自动化测试有点陌生,Cucumber并且无法理解为什么它会被启动两次。

请指导。

BrowserConfig.java

public class BrowserConfig {

    private static final String IE_DRIVER_EXE = "drivers/IEDriverServer.exe";
    private static final String WEBDRIVER_IE_DRIVER = "webdriver.ie.driver";
    private static final String BASE_URL = "https://www.google.com";

    public static WebDriver getIEWebDriver() {
        String filePath = ClassLoader.getSystemClassLoader().getResource(IE_DRIVER_EXE).getFile();
        System.setProperty(WEBDRIVER_IE_DRIVER, filePath);
        InternetExplorerOptions options = new InternetExplorerOptions().requireWindowFocus();
        options.setCapability(INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
        options.setCapability(ENABLE_ELEMENT_CACHE_CLEANUP, true);
        options.setCapability(IE_ENSURE_CLEAN_SESSION, true);
        options.setCapability(ACCEPT_SSL_CERTS, true);
        options.setCapability("nativeEvents", false);
        options.setCapability(INITIAL_BROWSER_URL, BASE_URL);
        WebDriver driver = new InternetExplorerDriver(options);
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        return driver;
    }

    public static void releaseResources(WebDriver driver) {
        if (null != driver) {
            driver.close();
            driver.quit();
        }
    }

}

TestRunner.java

@RunWith(Cucumber.class)
@CucumberOptions(
        plugin = {"pretty", "json:target/cucumber-reports/cucumber.json"},
        features = {"src/test/resources/features"})
public class TestRunner extends ApplicationTests {

}

登录步骤.java

@Ignore
public class LoginStep {

    WebDriver driver;

    @Before
    public void setup() {
        if (this.driver == null) {
            this.driver = BrowserConfig.getIEWebDriver();
        }
    }

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

    @Given("^The user is on the Login page$")
    public void doLogin() {
        System.out.println("The user is on the Login page");
    }

    @When("^The user enters the correct credentials on the Login page$")
    public void setWelcomePage() {
        System.out.println("The user enter the correct credentials on the Login page");
    }

    @Then("^The user is displayed Welcome page$")
    public void validate() {
        System.out.println("The user is displayed Welcome page");
    }

}

帮助步骤.java

@Ignore
public class HelpStep {

    WebDriver driver;

    @Before
    public void setup() {
        if (this.driver == null) {
            this.driver = BrowserConfig.getIEWebDriver();
        }
    }

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

    @When("^The user clicks on the Help menu link from the Welcome page$")
    public void setWelcomePage() {
        System.out.println("The user clicks on the Help menu link from the Welcome page");
    }

    @Then("^The user is displayed Help page$")
    public void validate() {
        System.out.println("The user is displayed Help page");
    }

}

帮助功能

Feature: Check that the user is able to navigate to Help page

  Background:
    Given The user is on the Login page
    When The user enters the correct credentials on the Login page
    Then The user is displayed Welcome page

  Scenario:
    When The user clicks on the Help menu link from the Welcome page
    Then The user is displayed Help page

pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cucumber-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cucumber-demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <cucumber.version>4.2.3</cucumber.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
            <plugin>
                <groupId>net.masterthought</groupId>
                <artifactId>maven-cucumber-reporting</artifactId>
                <version>3.14.0</version>
                <executions>
                    <execution>
                        <id>execution</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <projectName>${project.artifactId}</projectName>
                            <outputDirectory>${project.build.directory}/cucumber-reports</outputDirectory>
                            <cucumberOutput>${project.build.directory}/cucumber-reports/cucumber.json</cucumberOutput>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

标签: javaseleniumspring-bootautomationcucumber

解决方案


因为您在功能文件中初始化并调用您的驱动程序两次。

Background您的功能文件的一部分首先在初始化浏览器,LoginStep.java然后您Scenario也在初始化浏览器HelpStep.java

我更喜欢在不同的类之间使用全局Hooks.java@Before和钩子并注入驱动程序。@After.java


推荐阅读