与Google Guice + TestNG + Selenium GRID + Maven并行运行测试时的多个浏览器

时间:2014-01-03 08:02:10

标签: java testng guice selenium-grid

我搜索并阅读了几乎所有关于Selenium Grid的文章,并与testNG并行运行测试。但是,我仍然无法弄清楚我做错了什么。

使用页面对象模式我正在测试http://www.gmail.com。我使用Google Guice依赖注入为每个页面提供WebDriver,因为我在AbstractModule类中使用了@Provides注释:

public class GmailModule extends AbstractModule {
@Override
protected void configure() { ... }
String NODE_URL =  "http://localhost:5555/wd/hub";


@Provides
WebDriver getRemoteDriver() throws MalformedURLException {
    ThreadLocal<RemoteWebDriver> threadDriver = new ThreadLocal<RemoteWebDriver>();
    DesiredCapabilities capability = new DesiredCapabilities();
    capability.setBrowserName(DesiredCapabilities.firefox().getBrowserName());
    capability.setCapability(FirefoxDriver.PROFILE, new File(ResourceExaminer.getValueFromExpDataMap("firefoxprofile")));
    capability.setPlatform(Platform.XP);
    RemoteWebDriver webDriver = new RemoteWebDriver(new URL(NODE_URL), capability);
    threadDriver.set(webDriver);
    return threadDriver.get();
}
}

所有页面都扩展了抽象页面,我通过驱动程序,然后只使用它。

public abstract class AbstractPage extends HTMLElements{
public WebDriver webDriver;
@Inject
public AbstractPage(WebDriver driver){
    this.webDriver = driver;
    PageFactory.initElements(new HtmlElementDecorator(webDriver), this);
}
}

然后所有测试都扩展了AbstractTestingClass,它提供了Google @Guice注释以注入第一页。 我使用以下cmd行来运行Selenium Grid的集线器和节点:

java -jar selenium-server-standalone-2.39.0.jar -role hub -hubConfig DefaultHub.json java -jar selenium-server-standalone-2.39.0.jar -role node -nodeConfig DefaultNode.json

在DefaultNode.json中我减少了maxSessions = 2和browserName = firefox

的数量

我的测试套件包含以下内容

    <suite name="PositiveTestSuite" parallel="classes" thread-count="2" verbose="2">
    <test name="Attaching file">
        <classes>
            <class name="com.epam.seleniumtask.gmail.test.AttachingFilesTest"/>
        </classes>
    </test>
    <test name="2nd">
        <classes>
            <class name="com.epam.seleniumtask.gmail.test.ChangeSignatureTest"/>
        </classes>
    </test>
    <test name="3rd">
        <classes>
            <class name="com.epam.seleniumtask.gmail.test.CreateNewLabelTest"/>
        </classes>
    </test>
<test name="4th">
    <classes>
        <class name="com.epam.seleniumtask.gmail.test.DeletingMessagesTest"/>
    </classes>
     </test>

然而,测试运行非常奇怪 - &gt;

  • 打开4个浏览器,而不是2个。
  • 2个测试并行运行,但其他两个正在其他浏览器中等待。

我的问题是 - 1)为什么即使我在Selenium Grid中限制它们的数量,我仍然有3个浏览器? 2)如何强制我的测试仅在2个浏览器中运行? 2次测试,2次测试?

请帮帮我。我会感激任何答案。

1 个答案:

答案 0 :(得分:1)

感谢您的回答。 我终于明白了为什么我遇到这些问题。 如果有人需要答案 - &gt;我已经在每个测试类中为Google Guice注入了模块。因此,每次测试开始时都会初始化注入,因此新浏览器也已打开。

作为一种解决方案,我使用@Provides注入在Guice中使用延迟初始化。在每个@BeforeClass注释中,我都得到了提供者。这样的事情:

@Guice(modules = GmailModule.class)
public class ForwardTest extends AbstractTestingClass {

@Inject
Provider<SignInPage> providingSignInPage;

@BeforeClass
public void startUp(){
     signInPage = providingSignInPage.get();
}

在singInPage中有一个RemoteWebDriver。 现在它对我来说很好。