如何通过任何脚本语言将控制从本地机器传递到虚拟机?

时间:2017-07-31 07:22:51

标签: java selenium

我正在尝试构建一个selenium(Java)脚本,它通过RDP从本地计算机连接到虚拟机,我需要在连接到虚拟机后从虚拟机中的当前脚本运行一些命令。我面临的问题是本地机器的控制不会进入虚拟机,因为我无法在其中运行任何脚本或命令。请让我知道如何将控制从本地机器传递到虚拟机。要是更具体的是,我的本机中运行的selenium脚本能够在虚拟机中执行任何操作,该操作由在本地机器上运行的相同selenium脚本打开。

2 个答案:

答案 0 :(得分:0)

如果你的VM是linux,你可以使用jcraft进行控制。

注意:您应该启用SSH并对VM中的22端口进行本地IP访问。

  1. 从maven central repo https://mvnrepository.com/artifact/com.jcraft/jsch

    下载jcraft
    public class ssh {
    
        /**
         * JSch Example Tutorial
         * Java SSH Connection Program
         */
        @Test
        public static void connection(String host,String user, String password, String command) {
    
            try{
    
           java.util.Properties config = new java.util.Properties(); 
                config.put("StrictHostKeyChecking", "no");
                JSch jsch = new JSch();
                Session session=jsch.getSession(user, host, 22);
                session.setPassword(password);
                session.setConfig(config);
                session.connect();
                System.out.println("Connected");
    
                Channel channel=session.openChannel("exec");
                ((ChannelExec)channel).setCommand(command);
                channel.setInputStream(null);
                ((ChannelExec)channel).setErrStream(System.err);
                InputStream in=channel.getInputStream();
                channel.connect();
                byte[] tmp=new byte[1024];
                while(true){
                  while(in.available()>0){
                    int i=in.read(tmp, 0, 1024);
                    if(i<0)break;
                    System.out.print(new String(tmp, 0, i));
                  }
                  if(channel.isClosed()){
                    System.out.println("exit-status: "+channel.getExitStatus());
                    break;
                  }
                  try{Thread.sleep(1000);}catch(Exception ee){}
                }
                channel.run();
                channel.disconnect();
                session.disconnect();
                System.out.println("DONE");
    
            }catch(Exception e){
    
            }
    
        }
    
    }
    
    1. 通过提供服务器的主机地址,用户名,密码以及要在其中执行的命令来连接您的虚拟机。

      (实施例)

      public class start{
      static WebDriver driver;
          public static void main(String[], args)
          {
          //connect your VM by using method from ssh class
        ssh.connection("10.200.10.1", "userName", "password", "sudo service jenkins start");
          //execute selenium command once application started
             driver.findElement(By.xpath(".//*[@id='usr']")).sendKeys("Stack");
           //execute another command inside VM
      ssh.connection("10.200.10.1", "userName", "password", "cd /var/lib/jenkins/workspace && ls");
          }
      }
      

答案 1 :(得分:0)

可能无法实现。您的脚本可能会调用RDP协议来调用VM,但VM是它拥有内核和用户空间的独立实例。您运行的脚本将位于不同的内核和用户空间中。两者都不共享相同的内核和用户空间来访问空格之间的值。