如何根据用户的输入在 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 中同时启动浏览器实例?的主要内容,如果未能解决你的问题,请参考以下文章