如何根据用户的输入在JFrame中同时启动浏览器实例?

时间:2015-11-30 09:38:30

标签: java selenium jframe testng selenium-grid

我正在对Selenium进行测试,该测试将根据用户的输入访问网站。

在JFrame上,用户可以输入网站地址并按“运行”。这将调用Firefox浏览器实例并导航到URL。

但是,我希望能够根据用户的输入同时启动多个浏览器实例。

因此,当前测试仍在运行时,用户可以通过JFrame输入不同的URL链接,然后按“运行”,这将导出另一个导航到输入地址的Firefox浏览器实例。

任何人都可以告诉我如何实现这一目标吗?

这是我到目前为止所做的。

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();        
    }    
}

我有一个以编程方式设置的集线器和节点,以及一个线程本地远程Web驱动程序。

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.");
        }
    }
}

这是一个示例测试。我已经尝试过使用@DataProvider,但它接收了一个数组,而不是我正在寻找的。

public class TestRun extends TestConfig {

    @Test 
    public void test() {
        getDriver().get(url);
        getDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        getDriver().manage().window().maximize();
    }

}

最后,这是一个以编程方式编写的testng类。

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();

    }   
}

1 个答案:

答案 0 :(得分:0)

我假设你正在使用Swings,并会尝试从那一点回答。 在Swing中使用Concurrency

有两点你应该打扰:

<强> 1。使用Swingworker

运行JFrame组件操作的后台进程

单击Run JButton时,运行测试的较长过程应作为background tasks处理,否则GUI可能会在测试运行时冻结。

<强> 2。使用Executor

同时运行浏览器实例

单击两次按钮可以在后台运行测试,但似乎Swings允许运行单个浏览器实例。它支持并发,而不是多线程(What is the difference between concurrent programming and parallel programming?)。 因此,您需要使用Executor或Thread运行浏览器。

如果有帮助,请告诉我。此外,如果我错过了什么,请随时编辑。