我有一個Web應用程序,我可以從其中啓動另一個Java應用程序中的相應測試過程。我正在使用Socket編程來進行Web應用程序和Java應用程序之間的通信。如何同時運行多個線程進行自動Selenium測試?
當我從web應用程序請求特定的進程時,Java應用程序的SocketServer會聽到請求並啓動一個線程進行測試過程。 測試過程將初始化FirefoxDriver並啓動瀏覽器並進行進一步的測試過程。
我的問題是,當我要求另一個進程具有不同的進程名稱,然後它再次創建第二個線程並啓動Firefox瀏覽器,但這次它不考慮我的第二個進程,它開始做相同的進程,這是第一個線程。
我不明白該怎麼辦......對於每一個過程,我創建了一個新的線程,但進一步它會做同樣的過程。 我的輸入在Java應用程序中正確接收。 請幫我我怎麼做併發線程安全處理? 我正在使用GWT,Java,Seleniun FirefoxDriver。
這裏是它在後臺運行,並聽取客戶端請求的服務器代碼:
static final int PORT = 6789;
public static void main(String args[]) {
ServerSocket serverSocket = null;
Socket socket = null;
try {
InitializeApplication application = new InitializeApplication();
application.initialize();
serverSocket = new ServerSocket(PORT);
} catch (Exception e) {
log("Exception in SocketServerExecutor !!!",e);
}
while (true) {
try {
socket = serverSocket.accept();
} catch (Exception e) {
log("Exception in SocketServerExecutor !!!",e);
}
Thread thread = new Thread(new SocketServerThread(socket));
thread.start();
}
}
,這是啓動過程中的主題:
private Socket client;
public SocketServerThread(Socket serverSocket) {
this.client = serverSocket;
}
/**
* Starts appropriate process depending on process name from input.
* Input string contains:
* process name
*/
public void run() {
DataOutputStream outputStream = null;
String param = null;
try{
log("Just connected to "+ client.getRemoteSocketAddress());
try {
while ((param = in.readUTF()) != null){
log("got parameteres from client (i.e. from web app): "+param);
break;
}
} catch (Exception e) { }
if(param!=null && !param.isEmpty()){
String process = params[0];
ProcessManager manager = new ProcessManager();
if(process.equals("testUser"))
manager.startUserProcess(process);
else if(process.equals("testCustomer"))
manager.startCustomerProcess(process);
}
}catch(Exception exc){
if(exc instanceof SocketTimeoutException)
log("Socket timed out! [SocketServerThread]",exc);
else if(exc instanceof BindException)
log("BindException in SocketServerThread !!!",exc);
log(Level.SEVERE, "Exception in SocketServerThread !!!",exc);
}
}
,這是ProcessManager的:
public void starUserProcess(String siteName) {
ExecutorService executerService = null;
try{
Callable<Object> callable = new ProcessThread(siteName);
executerService = Executors.newCachedThreadPool();
Future<Object> future = executerService.submit(callable);
future.get();
log("[ProcessManager] Process completed for "+process);
System.exit(0);
}catch (Exception e) {
log("[ProcessManager]::Exception");
log(ex);
}
}
ProcessThread將初始化所有需要的東西和Firefox瀏覽器和啓動過程。 每次包含輸入的客戶端都是新的。
看到我編輯的問題... –