这个博客的起源是因为博主非常喜欢练习打字,在咱们程序员中,打字快相对于敲代码来说还是很有帮助的,我经常在 https://dazi.kukuw.com/?K5WK8 这个网站练习打字,果然,人外有人,天外有天,博主觉得自己的打字速度已经够快了,但是和网友相比,还是差那么一丝丝手速,可能是单身时间太短了;
出于对技术的研究和心理的不屈服,作为一个程序员当然有程序员的办法了,博主在这里用selenium和java实现程序自动打字,也是终于实现了自己的梦想;所以这是一个技术分享博客,大家不要乱用噢,用于个人测试还是可以的;话不多说,咱们直接上代码;
1、环境准备
selenium的安装和准备请参考博主之前的博客进行准备:JAVA配合selenium包对浏览器进行操作_小魏快起床的博客-CSDN博客_selenium配合java使用
2、代码实现
直接丢到idea中,开用,大家选择文章的时候,最好选择英文竞赛,汉语竞赛的等待完善;
@Log
public class DaZiPoJie {
// 指定打字网站链接
private static String url = "https://dazi.kukuw.com/";
//自己测试的文章打字设置时间
private static Integer time = 1;
//打字类型
private static String type = "竞赛";
public static void main(String[] args) throws InterruptedException {
//1、获取webdriver
WebDriver driver = WebDriverUtils.getNormalWebDriver();
driver.get(url);
//2、手动微信登录,需要手机扫码,所以需要debug运行,扫描成功了点击完成,然后放开断点
driver.findElement(By.xpath("//*[@id=\"form\"]/ul[1]/li[2]/span/span")).click();
System.out.println("手动登录成功");
//3、创建hashmap用来装列表
HashMap<String, Object> EnglishMap = new HashMap<>();
//4、竞赛业务代码块
if (type.equals("竞赛")) {
//4.1、进入到竞赛业务
driver.findElement(By.xpath("//*[@id=\"form\"]/ul[2]/li[2]/label[3]")).click();
driver.findElement(By.xpath("//*[@id=\"select_b\"]")).click();
//4.2、获取到有哪些文章 有2个ul
List<WebElement> ul = driver.findElements(By.className("ul"));
//4.3、循环ul,然后拿到所有的竞赛文章信息
for (WebElement u : ul) {
List<WebElement> aList = u.findElements(By.xpath("a"));
for (WebElement a : aList) {
String id = a.getAttribute("id");
String spanStr = a.getText() + a.findElement(By.xpath("span")).getText();
EnglishMap.put(id, spanStr);
}
}
//4.4、查看ul里面所有的信息
System.out.println("竞赛项目有如下:");
System.out.println("序号 键 值");
TimeUnit.MILLISECONDS.sleep(100);
Iterator<Map.Entry<String, Object>> iterator = EnglishMap.entrySet().iterator();
int i = 1;
//4.5、循环将竞赛文章信息标题输出到控制台 让用户自己选择
while (iterator.hasNext()) {
Map.Entry<String, Object> next = iterator.next();
System.out.print(i++ + " ");
System.out.print(next.getKey() + " ");
System.out.println(next.getValue());
}
//4.6、用户输入需要竞赛的键
boolean flag = true;
String next = null;
while (flag) {
System.out.println("请输入需要竞赛的键:");
Scanner scanner = new Scanner(System.in);
next = scanner.next();
if (EnglishMap.get(next) != null) {
flag = false;
log.info("正在启动中~~~");
} else {
log.info("输入的键在列表找不到!!!请重新输入");
}
}
//4.7、点击文章标题 开始自动跑
driver.findElement(By.xpath("//*[@id=\"" + next + "\"]")).click();
} else {
//更改时间
driver.findElement(By.className("time")).sendKeys(Keys.BACK_SPACE);
driver.findElement(By.className("time")).sendKeys("" + time);
}
//5、获取开始测试按钮
driver.findElement(By.className("button")).click();
//6、获取到页面content
WebElement content = driver.findElement(By.id("content"));
//7、从content里面获取到所有的id
List<WebElement> i_list = content.findElements(By.xpath("div"));
//8、循环
for (WebElement element : i_list) {
//处理i几的问题
String id = element.getAttribute("id");
//将字符串转换为字符数组
char[] chars = element.findElement(By.className("text")).findElement(By.xpath("span")).getText().toCharArray();
//循环开始模拟输入
for (char ch : chars) {
String str = "" + ch;
driver.findElement(By.xpath("//*[@id=\"" + id + "\"]/input[2]")).sendKeys(str);
try {
//打开这里的随机暂停时间,就可以不被系统检测
// Integer randomInt=new Random().nextInt(160)+20;
// Thread.sleep(randomInt);
Thread.sleep(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//循环完了后需要回车
driver.findElement(By.xpath("//*[@id=\"" + id + "\"]/input[2]")).sendKeys(" ");
}
}
}
3、效果截图
经过代码的运行,最终实现了梦想;
轻松拿下第一名,博主只做技术分享,大家测试就行 , 前几天阳了,一直没更新作品,更新不易,喜欢作者的作品的铁子们多支持支持,谢谢大家!!