I am running a test on Selenium which will visit a website according to the user's input.
On the JFrame, the user can enter the address of a website and press 'run'. This will call a Firefox browser instance and navigate to the URL.
However, I want to be able to start multiple browser instances concurrently based on the user's input.
So while the current test is still running, the user can enter a different URL link through the JFrame then press 'run', which will bring up another Firefox browser instance navigating to the entered address.
Can anyone give me an idea of how I can achieve this?
This is what I have so far.
public class TestFrame {
    static JFrame frame;
    static String url;
    public static void frame() {
        frame = new JFrame();
        frame.setSize(350, 100);
        frame.setLocationRelativeTo(null);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        JTextField text = new JTextField(20);
        JButton button = new JButton("Run");
        panel.add(text);
        panel.add(button);
        frame.add(panel);
        button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            url = text.getText();
            Testng func = new Testng();
            func.testRun();
        }
      });         
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        frame();        
    }    
}
I have a hub and node programmatically setup, and a thread local remote web driver.
public class TestConfig {
    ThreadLocal<RemoteWebDriver> driver;
    Hub hub;
    SelfRegisteringRemote remote;
    @BeforeClass
    public void setUp() throws Exception {
        // Start hub
        GridHubConfiguration config = new GridHubConfiguration();
        config.setHost("localhost");
        config.setPort(4444);
        hub = new Hub(config);
        hub.start();
        SelfRegisteringRemote node = null;
        RegistrationRequest req = new RegistrationRequest();
        // Create capabilities instance
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setBrowserName(DesiredCapabilities.firefox().getBrowserName());
        capabilities.setCapability(RegistrationRequest.MAX_INSTANCES,5);
        // Set configurations for registration request
        Map<String, Object> nodeConfig = new HashMap<String, Object>();
        nodeConfig.put(RegistrationRequest.AUTO_REGISTER, true);
        nodeConfig.put(RegistrationRequest.HUB_HOST, hub.getHost());
        nodeConfig.put(RegistrationRequest.HUB_PORT, hub.getPort());
        nodeConfig.put(RegistrationRequest.PORT, 5555);
        URL remoteURL = new URL("http://" + hub.getHost() + ":" + 5555);
        nodeConfig.put(RegistrationRequest.PROXY_CLASS,
                "org.openqa.grid.selenium.proxy.DefaultRemoteProxy");
        nodeConfig.put(RegistrationRequest.MAX_SESSION, 5);
        nodeConfig.put(RegistrationRequest.CLEAN_UP_CYCLE, 2000);
        nodeConfig.put(RegistrationRequest.REMOTE_HOST, remoteURL);
        nodeConfig.put(RegistrationRequest.MAX_INSTANCES, 5);
        // Registration request
        req.addDesiredCapability(capabilities);
        req.setRole(GridRole.NODE);
        req.setConfiguration(nodeConfig);
        // Register node 
        node = new SelfRegisteringRemote(req);
        node.startRemoteServer();
        node.startRegistrationProcess();        
    }
    @BeforeMethod
    public void start() throws MalformedURLException, IOException, Exception {
        driver = new ThreadLocal<RemoteWebDriver>();
        // Set capabilities
        DesiredCapabilities dc = new DesiredCapabilities();
        FirefoxProfile profile = new FirefoxProfile();        
        dc.setCapability(FirefoxDriver.PROFILE, profile);
        dc.setBrowserName(DesiredCapabilities.firefox().getBrowserName());
        URL remoteURL = new URL("http://" + hub.getHost() + ":" + hub.getPort() 
                + "/wd/hub");
        RemoteWebDriver remoteDriver = new RemoteWebDriver(remoteURL, dc);
        driver.set(remoteDriver);
    }
    public WebDriver getDriver() {
        return driver.get();
    }
    @AfterClass
    public void shutdown() throws Exception {
        if (remote != null) {
            remote.stopRemoteServer();
            System.out.println("Node stopped.");
        }
        if (hub != null) {
            hub.stop();
            System.out.println("Hub stopped.");
        }
    }
}
This is an example test. I have tried using @DataProvider but that takes in an array, not quite what I'm looking for.
public class TestRun extends TestConfig {
    @Test 
    public void test() {
        getDriver().get(url);
        getDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        getDriver().manage().window().maximize();
    }
}
Finally, this is a programmatically written testng class.
public class Testng {
    public void testRun() {
        XmlSuite suite = new XmlSuite();
        suite.setName("Project");
        XmlTest test = new XmlTest(suite);
        test.setName("Downloader");
        List<XmlClass> classes = new ArrayList<XmlClass>();
        classes.add(new XmlClass("example.testing.TestRun"));
        test.setXmlClasses(classes);
        List<XmlSuite> suites = new ArrayList<XmlSuite>();
        suites.add(suite);
        TestNG tng = new TestNG();
        tng.setXmlSuites(suites);
        tng.run();
    }   
}
 
     
    