【问题标题】:Cucumber + Selenium Java : keep the browser open between test casesCucumber + Selenium Java:在测试用例之间保持浏览器打开
【发布时间】:2015-10-14 14:39:40
【问题描述】:

我目前在 Java 中使用 Cucumber 和 Selenium WebDriver 来测试 Web 应用程序。 我对在每个测试用例之间关闭并重新打开浏览器这一事实不太满意。

首先,它很慢,另外,它对我来说毫无意义。

我想做的是在每次测试之间注销应用程序并保持浏览器打开。

我认为这条线可以完成工作,但它没有按预期工作:

driver.navigate().to("http://myurl.url");

而不是:

driver.get("http://myurl.url");

它会打开一个新的浏览器。我理解它为什么这样做,但我想附加到我之前的浏览器会话。

【问题讨论】:

标签: java selenium


【解决方案1】:

我找到了一种在测试之间保持浏览器打开的方法。我将Singleton Design Patternpicocontainer 一起使用。 我在这个类中以static 声明我的浏览器。

public class Drivers {
    private static boolean initialized = false;
    private static WebDriver driver;

    @Before
    public void initialize(){
        if (!initialized){
            initialized = true;
            driver = new FirefoxDriver();
            driver.get("http://myurl.url");
        }
    }
    public static WebDriver getDriver(){
        return driver;
    }   
}

在每个StepDefinitions 类中,我都有一个构造函数来实例化我的Singleton

public class DashboardSteps extends SuperSteps {
    Drivers context;

    @After
    public void close(Scenario scenario) {
        super.tearDown(scenario);
        loginPage = homePage.clickLogout();
        loginPage.waitPageLoaded();
    }

    public DashboardSteps(Drivers context) {
        super(context);
    }

SuperSteps 类:

public class SuperSteps {
    protected Drivers context;

    public SuperSteps(Drivers context){
        this.context = context;
    }

如您所见,每次测试后我都会返回登录页面,因此我可以独立运行每个测试。

【讨论】:

  • 我在 SubStep 类文件中看到了裂缝。必须在每个子步骤类文件中编写它不是一个限制吗?如果在初始化步骤中登录,确保用户退出可以解决此问题?
  • 在初始化时可以验证用户是否已注销是正确的。但是如果我没记错的话,子类不会继承超类的注释,所以你必须在每个 SubStep 类文件中调用 tearDown。
【解决方案2】:

如果我是正确的,您的浏览器实例化可能发生在@Before 标记为setUp 的方法中,而关闭将发生在@After 标记的tearDown 方法中。如果您想停止关闭浏览器,只需在 tearDown 或您正在执行的任何操作中注释掉该代码即可。

【讨论】:

  • 您好,感谢您的回答。你是对的,但问题是我必须导航到一个 URL。为此,我将其设置为“@Before”。在我的“@After”方法中,我没有关闭浏览器,但在接下来的测试中,“@Before”打开了一个新的浏览器。
  • 如果您不想并行运行测试,则再进行一次黑客攻击,然后在 Before 方法中设置一个标志,如果还有更多测试要运行或当前测试是最后一个测试,则在方法后签入.一旦你到达@after 中的最后一个测试,就关闭浏览器。
【解决方案3】:

您可以使用@BeforeClass@AfterClass 注释。它们分别在@Before 之前和@After 之后运行。假设您要测试的测试用例在同一个类中,您可以在 @BeforeClass 方法中初始化您的 WebDriver 并在 @AfterClass 方法中关闭它。

【讨论】:

  • 我实际上并没有在同一个班级进行所有测试。这就是我有这个问题的原因。我现在找不到解决方案:(
  • 您将遇到的一个问题是 JUnit 没有对测试的执行顺序做出任何承诺。您可以将它们全部转储到一个套件中,但这无助于浏览器重新启动。您究竟为什么希望保持浏览器打开?纯粹是为了速度,还是有其他原因?
  • 主要是为了速度。当您运行 2k 测试时,打开/关闭会在该过程中增加太多时间。但这也是因为我认为它不需要那样工作。
  • This link 有一些可能或可能不合理的想法。 djangofan 的响应(大约是第二个)提到使用 Selenium Grid 并行运行多个测试。还有一些其他选项可用于并行运行测试。但我不知道你实际上可以非常干净地做你希望做的事情。 Djangofan 的原始解决方案可能会奏效,但正如他所指出的,它并没有真正符合最佳实践。希望有帮助!祝你好运!
  • 对 BDD 使用 SpecFlow 会在场景之间关闭浏览器。因此,即使测试都在同一个类中,场景会故意以干净的状态执行......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多