如何让Selenium和TestNG打开一个浏览器以在多个类中运行测试

时间:2009-07-19 02:12:17

标签: selenium testng

我正在使用Selenium和TestNG来测试一个网站。我使用Selenium IDE创建了测试并将它们导出到TestNG,每个测试都是一个类中的方法。例如,

对于登录测试,有一个Login类,它有方法testLogin(),testLogin2()等 对于注册测试,有一个Signup类有方法testSignup(),testSignup2()等

我正在使用Ant来运行测试工作正常,除了每个类将打开一个浏览器然后运行它的方法,例如,如果我有五个类,那么五个浏览器将同时打开然后运行测试。 / p>

我想要的是让Ant / Selenium / TestNG只打开一个浏览器,然后在我在testng.xml中指定的所有类中运行所有测试(在同一个浏览器中)。使用上面的示例,我想要打开一个浏览器,然后运行testLogin(),testLogin2(),testSignup(),testSignup2()。 如果无法实现,那么我想打开浏览器,在类中运行所有测试,然后关闭浏览器,然后打开另一个浏览器,然后在下一个类中运行测试方法集。

任何帮助表示赞赏。提前谢谢。

3 个答案:

答案 0 :(得分:2)

今天我找到了适合我的答案。给我几分钟时间收集所有代码示例:)

Init.java

//base class that will be called before all tests
@Test(groups = "init")
public class Init{

    DefaultSelenium browser;

    public void start(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.open("url");
        browser.click("xpath");
    }

}

TemplateForClasses.java

/* - all public methods will be tests
 * - all tests will be called after group init
 * - just before suite will start we will start 1 browser instance
 */
@Test(dependsOnGroup="init")
public class TemplateForClasses{

    DefaultSelenium browser;

    @BeforeSuite
    public void startBrowser(ITestContext itc){
        browser = new DefaultSelenium(host,port,browser_type,url);
        itc.setAttribute("browser",browser);
        browser.start();
    }

    @AfterSuite
    public void stopBrowser(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.stop();
    }

    //any other: @Before, @After methods

}

FirstGroupOfTests.java

//all tests classes will inherit preferences set in TemplateForClasses
public class FirstGroupOfTests extends TemplateForClasses{

    public void FirstTest(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        //browser.click("start");
    }

}

想法:

  • 启动浏览器只需进行一次测试
  • 在每个其他测试之前运行(isBrowserRunning)
  • 参考单一测试的浏览器

此代码已经过测试,但目前我从头顶开始测试,所以我明天可以编辑它以使其更加准确。

更新: 此结果基于testng.org文档+我在stackoverflow上提出的一些问题+在几个论坛/组中找到的一些答案

我必须添加我以编程方式运行testng并且我正在动态生成xml(就像在documentation.org上一样)。我在一个包中使用它,我将包添加到xml中,仅包括类Init +继承自TemplateForClasses的类。如果你需要那个xml,请告诉我。

答案 1 :(得分:0)

我也被困在同一个问题很长一段时间了。我会用最简单的术语解释它。请考虑以下示例:

Class A (contains the code selenium.start();)
|
|(inherited classes)
|--------class B   }
|--------class C   }  Have some @Test methods
|--------class D   }

现在每次运行这些测试方法时,它都会执行父类构造函数selenium.start()中的代码;多数浏览器将在您的屏幕上全部打开。

现在逐个执行测试方法 - 假设在B类中执行测试,它们将在一个窗口中发生,对于C类则在另一个窗口中发生,等等。

所以基本上,你所要做的就是从父构造函数中删除start()代码并将它放在B,C和D类中。

只要您继续使用一个selenium对象,一切都将在一个浏览器窗口中发生。当你把start();浏览器将打开(如果它没有打开)并创建一个新会话。停();会议终止。

控制流程就像这样=>

Class A, Class B
Class A, Class C
Class A, Class D

因此,如果你能找到一种方法来继续使用相同的selenium对象,上面显示的整个执行序列只有1个start()和1个stop(),那么你的测试执行只会在一个浏览器窗口中进行。

如果你在A类中放入start()代码并在B,C和D中各自停止代码,那么你将有3个窗口打开,并且随着执行的进行逐个关闭。

如果在B,C和D中单独放置start()和stop()代码,那么您将看到一个浏览器打开,执行测试用例,关闭。然后另一个将打开,执行C的测试用例,关闭等。

希望这会有所帮助。 : - )

答案 2 :(得分:0)

我用Spring的依赖注入做到了这一点。初始代码在工厂中。我需要一种方法让Selenium实例不仅在测试之间共享,而且在辅助类之间共享。很少有selenium.someMethod()在测试中直接调用。它更像是helper.goToSomePage()或preferencesPage.changePassword(....)。

在测试之间共享一个Selenium实例可能被认为是一个坏主意,但它带来的少数错误并不难找到。测试按顺序运行,Selenium对象不需要是线程安全的。但是,对象的状态必须保持一致。

有关信息,Spring是一个Java框架,而依赖注入只是其中的一部分。当然也可以使用像Guice这样的其他DI框架。