如何同时运行多个线程进行自动Selenium测试?

时间:2012-10-11 12:58:09

标签: java multithreading gwt selenium thread-safety

我有一个Web应用程序,我可以从另一个Java应用程序开始各自的测试过程。我正在使用Socket Programming在Web应用程序和Java应用程序之间进行通信。

当我从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浏览器并启动进程。 客户端每次都是新的,包含输入。

2 个答案:

答案 0 :(得分:0)

我能想到的两件事之一可能正在发生。

  1. 您正在将一个参数传递给run()函数,该函数链接回初始线程或...

  2. 您正在使用所有线程均可访问的共享变量,并且该变量未正确更新或根本未更新。

  3. 如果您可以加入SSCCE,那将有助于我们确定问题的确切位置。

答案 1 :(得分:0)

获得解决方案:我使用 newSingleThreadExecutor()而不是 newCachedThreadPool()创建 ExecutorService ,并为每个新创建了setDeamon(True)创建了ServerThread。 Here is the Executor documentation