【问题标题】:tearDown is not being initialisedtearDown 没有被初始化
【发布时间】:2019-07-14 07:53:37
【问题描述】:

我有一个 Java 自动化脚本。我有一个有效的设置方法,但由于某种原因我的 tearDown 没有被读取。

当我运行自动化测试时,我似乎遇到了两个问题

  1. 如果多次运行测试失败并且浏览器窗口保持打开状态。
  2. 即使测试通过了浏览器窗口也永远不会关闭,这让事情变得非常混乱。

我没有为实际测试添加任何代码功能文件,因为我认为问题出在设置中,但我很乐意这样做。

我怀疑这两个问题是相关的,但我不知道在哪里或如何。

这是我的 SeleniumSetUp 类

public class SeleniumSetup {

    protected WebDriver driver;

    public SeleniumSetup(WebDriver driver)
    {

    }

    public SeleniumSetup() {

    }

    public void prepareBrowserForSelenium() {

//      setup();
        if(DriverSingleton.getDriver() == null)
        {
            setup();    
        }
        else
        {
            driver = DriverSingleton.getDriver();
        }

    }

    public void setup() {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Selenium and drivers\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.get("http://the-internet.herokuapp.com/");
        driver.manage().window().maximize();
        System.out.println("Set up running");

    }

    public void tearDown() {

        driver.quit();
        System.out.println("Tear down running");
    }

}

我添加了一个 Println,并且可以看到当我运行我的脚本时它永远不会返回。

这是我的基本页面;

package pages;

import org.openqa.selenium.WebDriver;

public class BasePage {

    protected WebDriver driver;

    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

}

还有我的司机

package support;

import org.openqa.selenium.WebDriver;

public class DriverSingleton {

    private static WebDriver driver;

    public DriverSingleton () {

    }

    public static WebDriver getDriver() {
        return driver;
    }

    public static void setDriver (WebDriver driver) {
        DriverSingleton.driver = driver;
    }

}

任何帮助将不胜感激。

【问题讨论】:

  • 将 sysout 放在您的拆卸方法中,在您执行退出的行之前。如果退出引发异常,您的 sysout 将永远不会被调用
  • 我刚刚完成,再次运行我的脚本,输出中没有显示“tearDown”消息
  • 我对 selenium 不太熟悉,但根据您使用的测试框架,您可以使用一些注释来确保调用 setup 和 teardown 方法。在 Junit 中有 @Before@BeforeClass@After@AfterClass。我相信 TestNg 也有类似的注释。这是来自 Junit 的示例,ecanarys.com/Blogs/ArticleID/170/…
  • 我正在使用 Junit 并且在我的 tearDown 方法之前添加了 After 和 AfterClass 并且它没有产生任何影响
  • 您确定您是通过 Junit 运行测试吗?一种简单的测试方法...如果您删除上面的@test 注释,您可以运行测试吗?如果你仍然可以运行你的测试,那可能意味着你没有正确使用测试运行器,这意味着它不会调用你用@Before@After注释的方法如果你添加代码可能会有所帮助您尝试运行的示例测试。

标签: java selenium automation


【解决方案1】:

您的DriverSingleton的驱动似乎从未被初始化过,而在SeleniumSetup类的setup()方法中,SeleniumSetup的驱动在每次运行代码时都会被初始化并使用,将tearDown()放在setup()的末尾,而您的浏览器窗口将关闭。

System.setProperty("webdriver.chrome.driver", "C:\\Users\\Selenium and drivers\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://the-internet.herokuapp.com/");
driver.manage().window().maximize();
System.out.println("Set up running");
   // <<------your test scenario should be placed here 
tearDown();

【讨论】:

  • 感谢您,我们取得了进展。我已将 teafDown() 添加到 setUp() 方法,页面现在正在关闭。但是它在我的脚本运行之前关闭。现在它会立即打开和关闭。我需要更改我的 TearDown() 方法吗?
  • 只需将您的测试脚本放在我为您的代码注释的正确位置。
  • 记住,你最好使用一些junit预定义的注解和方法来完成这些步骤,你可以定义一个方法在你的测试场景之前运行和另一个在你的测试场景之后运行,这些方法可以帮助你自动运行您的设置和拆卸步骤。
【解决方案2】:

尝试使用 junit(j5 jupiter) 接口扩展您的驱动程序类并覆盖之前/之后的方法,这是一个简单的示例,使用您的一些代码:

import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.BeforeAllCallback;
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback;
import org.junit.jupiter.api.extension.ExtensionContext;

public class Driver implements AfterTestExecutionCallback, BeforeTestExecutionCallback, BeforeAllCallback, AfterAllCallback {

    protected WebDriver driver;

    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Selenium and drivers\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.get("http://the-internet.herokuapp.com/");
        driver.manage().window().maximize();
        System.out.println("Set up running");
    }

    @Override
    public void afterAll(ExtensionContext context) throws Exception {
        driver().quit();
    }

    @Override
    public void beforeTestExecution(ExtensionContext context) throws Exception {
        //whatever steps you need before EACH test, like navigate to homepage etc...
    }

    @Override
    public void afterTestExecution(ExtensionContext context) throws Exception {
        // steps do to after each test, best practice is to clear everything:
        driver.manage().deleteAllCookies();
        driver.executeScript("window.sessionStorage.clear()");
        driver.executeScript("window.localStorage.clear()");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多