繁体   English   中英

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

[英]How to run multiple threads concurrently for Automated Selenium testing?

我有一个Web应用程序,从中可以启动另一个Java应用程序中的相应测试过程。 我正在使用套接字编程在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浏览器并启动进程。 每次包含输入内容的客户端都是新的。

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

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

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

如果您可以包括SSCCE,那将有助于我们确定问题的真正根源。

得到了解决:我创建使用newSingleThreadExecutor()而不是newCachedThreadPool()以及(真)为每个新创建的ServerThread 的ExecutorService setDeamon。 这是执行器文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM