我正在对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,但它接收了一个数组,而不是我正在寻找的。 p>
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();
}
}
答案 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运行浏览器。
如果有帮助,请告诉我。此外,如果我错过了什么,请随时编辑。