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

Posted

技术标签:

【中文标题】如何根据用户的输入在 JFrame 中同时启动浏览器实例?【英文标题】:How to start browser instances concurrently in JFrame based on user's input? 【发布时间】:2016-03-03 21:39:48 【问题描述】:

我正在 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】:

我假设您正在使用 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 来运行浏览器。

如果这对你有帮助,请告诉我。另外,如果我遗漏了什么,请随时编辑。

【讨论】:

以上是关于如何根据用户的输入在 JFrame 中同时启动浏览器实例?的主要内容,如果未能解决你的问题,请参考以下文章

java如何实现用户在文本框中输入好友昵称,点击查询,根据用户输入匹配好友昵称,结果加载到下拉框中

如何让线程等待 JFrame 在 Java 中关闭?

如何同时只显示一个JFrame窗口

如何在 Swing jframe 中嵌入 SWT 浏览器

如何在 jFrame 上布局多个面板? (爪哇)

jframe如何获取字符串数据的错误