在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网

时间:2022-02-02 08:06:04

标题有点长,主要是写个bat出来玩玩,

(1)不用每次都手动关闭mysql服务(我不想把它设为手动启动,有强迫症)

(2)然后希望每次vmware能自动连上虚拟机

(3)以及每次Xshell都能自动启动,然后就连上虚拟机

(4)然后校园网每次都要打开,输入帐号密码什么的,才能连网,我希望它自己搞定

做完了这几步还是有点意思的,主要是浏览器还是网页的什么自动化测试,然后eclipse下项目打包成可执行的jar包

现在听我娓娓道来吧!

前面要达到的目的跟着后面的命令并无关联

(1)首先在bat里面关闭mysql服务

这个mysql的服务的关闭很简单,但是要以管理员方式执行,否则是会拒绝访问的

net stop mysql

这一步还是比较简单的

(2)在CMD里面启动虚拟机并让其打开一个操作系统的方式有如下两种,其中一种是

"D:\Program Files (x86)\VMware\VMware Workstation\vmware.exe" -x "F:\Virtual Machines\CentOS_64_minimal\CentOS 64 位.vmx"

这个方式可以打开虚拟机,但是,这里一定要有但是,它是以图形界面打开的,也就说,如果你不关掉这个图形界面这个命令将会一直处于执行状态

这样就不好了,你这飞完了翔还在这儿蹲着,不太合适,所以这个不好,那么只好采用下面的一种:

"D:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" start "F:\Virtual Machines\CentOS_64_minimal\CentOS 64 位.vmx" nogui

这中启动方式的好处就是不用打开图形界面,直接在后台启动vmware,并打开对应的操作系统,而且执行完了这句马上可以执行下一句。

(3)cmd下延时

启动完了vmware及其对应的操作系统之后呢,我们并不能直接的用Xshell去连虚拟机,应为虚拟机开启要花一定的时间,所以呢我们需要延时40~60s钟,这个依据个人电脑的配置而决定,采用的语句为:

ping -n 60 127.0.0.1  > nul

其实我也是没有想到居然使用ping这个命令来延时,-n后面的60代表ping这个命令进行60次还是60秒来着

> nul则是不用输出ping的结果,万万没想到你居然是这种ping

(4)Xshell连接虚拟机

start "" "D:\Program Files (x86)\NetSarang\Xshell 5\Xshell.exe"  -url ssh://jack:rose@192.168.197.129:22

这条命令可以在cmd下调用Xshell直接连接虚拟机,并且在打开Xshell的图形界面之后,cmd并不会滞留在这条命令

其中jack是我的虚拟机的一个用户名

而rose则是密码

192.168.197.129:22中192.168.197.129是虚拟机的ip地址,然后22则是端口号这个都不用改,只需要你的用户密码就行

(5)直接填写校园网的帐号密码并驱动浏览器登录

这个呢是比较复杂的一个部分,如果打开网页没有连网,那么浏览器便会跳转到登录界面,

本来呢校园网的帐号密码都是记住的,这时候只要运行个js执行登录的click( )就好了,

之前的做法是用cmd上直接用chrome.exe去打开百度,然后chrome里面就会有一个插件,自动执行js

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" www.baidu.com

这句话在cmd里面执行会使得chrome打开baidu,后然就自动执行插件

在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网

这些就是插件里面的所有内容,放在一个叫做HelloWorld的文件夹中,然后在chrome中添加此插件就行了

在CMD下启动vmware、Xshell连接虚拟机以及控制Chrome浏览器自动执行js登录校园网

1.png是全智贤的图片作为图标吧

然后manifest.json是插件的主要程序

{
"name": "第一个Chrome插件",
"manifest_version": 2,
"version": "1.0",
"description": "我的第一个Chrome插件,还不错吧",
"browser_action": {
"default_icon": "1.png"
},
"content_scripts": [
{
"matches": ["http://192.168.0.1/*"],
"js": ["myscript.js"]
}
]
}

这个扩展程序也十分简单,其中"matches": [http://192.168.0.1/*],的意思是如果匹配到了这个网址的话

那么就执行下面的js里面的内容,ip是我瞎编的,我们学校的ip怎么能告诉你们呢,要脸!

myscript.js里面的内容则是:

void((function(){
document.getElementById("loginname").value = "120";
document.getElementById("password").value = "119";
document.getElementById("action_login").click();
})())

这个js也很简单,直接就是填入帐号密码,然后呢,就是执行登录按钮。

其实这种做法也是可以的啦,但关键是我是个有情怀(强迫症),尼玛这样一搞浏览器登录校园网的帐号之后就不能自动关闭了,我受不了了。

然后在cmd下又不能让chrome自动退出,只能强行关闭进程,强行关闭进程之后呢,chrome在此打开的之后又会叨叨叨,什么异常关闭blabla

于是乎这条路也是走不通了。另外再想办法吧。

一个神奇的做法出来了,就是所谓的自动化测试了。

首先要用的工具有两个:一个是selenium,另外一个则是chromedriver_x64.exe

其中chromedriver_x64.exe是用来驱动chrome浏览器的,

而selenium我也不知道是来干嘛的,反正你往下看吧。

首先下载selenium,然后解压,里面的jar是拿来调用的

然后下载chromedriver_x64并且放在chrome.exe所在的目录下,我的是在:

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

第一个版本的程序是:

package com.test.bat;

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; public class DriveChrome { public static void main(String[] args) {
// TODO Auto-generated method stub
//设置访问ChromeDriver的路径
System.setProperty("webdriver.chrome.driver",
"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver_x64.exe"); WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com/"); // "http://192.168.0.1/srun_portal.php?cmd=login&switchip="是用来判断是否是校园网的登录页面
// 是登录页面那么我们就要执行js,否则不执行
if (driver.getCurrentUrl().startsWith("http://192.168.0.1/srun_portal.php?cmd=login&switchip=")) {
//System.out.println(driver.getTitle());
//System.out.println(driver.getCurrentUrl());
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById(\"loginname\").value = \"120\"");
jse.executeScript("document.getElementById(\"password\").value = \"119\"");
jse.executeScript("document.getElementById(\"action_login\").click()");
}
driver.quit();
return;
}
}

这个需要你把selenium解压下的2个jar包以及解压文件夹下lib文件夹的jar都导入到java项目中,

其实这个也没啥问题,可以登录也可以关闭chrome浏览器,但是,又有但是呢,尼玛驱动chrome浏览器的chromedriver_x64.exe这个进程一直在

在我们这里很简单直接在cmd强行杀死该进程就可以了,但是他们做测试的人说,这样不行啊,测试的时候这个chromedriver_x64.exe可是要一直调用呢,

最后是在这个代码里面就把它关掉呢!

于是诞生出下面的一个版本:

package com.test.bat;

import java.io.File;
import java.io.IOException; import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait; public class StartChrome { public static void main(String[] args) { ChromeDriverService service = new ChromeDriverService.Builder().usingDriverExecutable
(new File("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver_x64.exe"))
.usingAnyFreePort().build();
try {
service.start();
System.out.println("test");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
WebDriver driver = new RemoteWebDriver(service.getUrl(),
DesiredCapabilities.chrome());
// WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com/");
// System.out.println(driver.getCurrentUrl());
// 通过判断 title 内容等待搜索页面加载完毕,间隔10秒 try {
(new WebDriverWait(driver, 20)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("用户登录");
}
}); } catch (WebDriverException e) {
driver.quit();
service.stop();
return;
} if (driver.getCurrentUrl().startsWith("http://192.168.0.1/srun_portal.php?cmd=login&switchip=")) {
//System.out.println(driver.getTitle());
//System.out.println(driver.getCurrentUrl());
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById(\"loginname\").value = \"120\"");
jse.executeScript("document.getElementById(\"password\").value = \"119\"");
jse.executeScript("document.getElementById(\"action_login\").click()");
}
driver.quit();
service.stop();
return;
}
}

这里呢chromedriver_x64.exe的执行是可以控制的,

service.start();

service.stop();

这两句话就可以解决chromedriver_x64.exe进程的打开和关闭,而且这里面还添加了浏览器加载过程中的等待

然后就是,将这个项目打包,我在eclipse中打包的是可执行的jar包。

调用这个可执行的jar包的命令为:

java -jar C:\Users\PC126\Desktop\hahaha.jar

最后虽然是可以关闭chromedriver_x64这个进程,但是呢会留下conhost.exe这个进程,这个进程只好在cmd里面删掉了

最后的bat是:

 echo 这是一个难得的注释,其实我是在胡说八道,为了多凑点字

net stop mysql

"D:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" start "F:\Virtual Machines\CentOS_64_minimal\CentOS 64 位.vmx" nogui

ping -n 60 127.0.0.1
echo ping -n 60 127.0.0.1 > nul start "" "D:\Program Files (x86)\NetSarang\Xshell 5\Xshell.exe" -url ssh://jack:rose@192.168.197.129:22 java -jar C:\Users\PC126\Desktop\hahaha.jar "D:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe" taskkill /f /t /im conhost.exe

本篇纯属好玩