黄瓜@Before钩子跑了两次@After一次

问题描述 投票:1回答:1

对所有人。使用Java11 + Junit5 + Cucumber + Selenium,编写一个小的BDD测试自动化框架,构建工具:Graddle。为验证Google标题创建了一个小测试。在开始测试时,在Graddle中使用Test task或运行CucumberRunner类,在两种情况下获得相同的结果:执行@Before方法两次,执行@After方法并且一个浏览器窗口保持打开状态。再添加一个测试后,同样的情况下,只打开了4个浏览器,其中2个正在关闭。有谁可以帮助解决这个问题?

Link to repository

在观察了一些日志之后,看来,@ Before并没有被执行两次,但是Driver类被初始化了两次,但为什么它现在不知道...

我现在的代码:CucumberRunner.java

@RunWith(Cucumber.class )
@CucumberOptions(
        features = "src\\test\\java\\features",
        glue = {"steps", "utils"},
        tags = "@smoke")
public class CucumberRunner {
}

Driver.java

public class Driver {
    private WebDriver driver;

    public Driver(){
        driverInitialization();
    }

    private void driverInitialization(){
        System.setProperty("webdriver.chrome.driver", "D:\\Soft\\selenium-drivers\\chromedriver.exe");
        System.out.println("Starting driver.");
        var browserName = "chrome";
        switch (browserName.toLowerCase()){
            case "chrome":
                System.out.println("Starting chrome");
                driver = new ChromeDriver();
                System.out.println("Before break.");
                break;
            case "firefox":
                driver = new FirefoxDriver();
                break;
            default:
                throw new NotFoundException("Browser not found: " + browserName);
        }
    }

    public WebDriver getDriver(){
        return driver;
    }

    public WebDriverWait getWebDriverWait(){
        return new WebDriverWait(driver, 120);
    }

    public void terminateDriver(){
        System.out.println("Terminating driver.");
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}

Hooks.java

public class Hooks {
    private Driver driver;

    @Before
    public void setup(){
        System.out.println("In the Setup method.");
        driver = new Driver();
    }

    @After
    public void tearDown(){
        System.out.println("In the TearDown method.");
        driver.terminateDriver();
    }
}
selenium-webdriver cucumber selenium-chromedriver junit5 cucumber-junit
1个回答
3
投票

我认为你的Hook Class应该像你使用selenium-picocontainer DI一样。

public class Hooks {

private Driver driver;

public Hooks(Driver driver) {
    this.driver = driver;
   }

@Before
public void setup(){
    System.out.println("In the Setup method.");
   }

@After
public void tearDown(){
    System.out.println("In the TearDown method.");
    driver.terminateDriver();
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.