河南科技学院自动化评教

由于我们学校每学期都要评教一两次,每次都会有大量的老师,有着重复式的机械性工作,所以我使用Go中的chromedp包写了一个可用的自动化评教的脚本用于替代这些重复性的工作。
该脚本只适用于我们学校的教务系统,如果有小伙伴感兴趣可以给我要源码去修改
首先先使用chromedp包去操作浏览器,在这一步中最难的是拿到内联框里面的元素,这个是我问了一些学姐之后才知道的,主要的是使用chromedp模拟用户去操作chrome
现在的功能:
1.可以登录你的学号密码进行评教,不需要你操作
2.可以看到操作页面
不足:
1.拿到的要评教的那一匹需要每次都换
2.没有做用户的评分及评价的自由,只能根据代码的分数进行
3.需要下载个程序,有点麻烦
希望有大佬可以指点一下
在这其中遇到了很多的问题:
第一个就是chromedp包的使用和配置问题,这个我翻了很多篇博客总结了以下常用的配置即操作方法

配置
//不检查默认浏览器
chromedp.NoDefaultBrowserCheck,
//禁用chrome的handless(禁用无窗口模式,即开启窗口模式)
chromedp.Flag("headless", false),
//开启图像界面
chromedp.Flag("blink-settings", "imageEnabled=true"),
//忽略错误
chromedp.Flag("ignore-certificate-errors", true),
//禁用网络安全标志
chromedp.Flag("disable-web-security", true),
//开启插件支持
chromedp.Flag("disable-extensions", true),
chromedp.Flag("disable-default-apps", true),
chromedp.Flag("enable-automation", false),
chromedp.Flag("disable-popup-blocking", true),
//设置网站不是首次运行
chromedp.NoFirstRun,
//设置窗口大小
chromedp.WindowSize(1900, 1024),
操作
chromedp.NewContext() 初始化chromedp的上下文,后续这个页面都使用这个上下文进行操作
chromedp.Run() 运行一个chrome的一系列操作
chromedp.Navigate() 将浏览器导航到某个页面
chromedp.WaitVisible() 等候某个元素可见,再继续执行。
chromedp.Click() 模拟鼠标点击某个元素
chromedp.Value() 获取某个元素的value值
chromedp.ActionFunc() 再当前页面执行某些自定义函数
chromedp.Text() 读取某个元素的text值
chromedp.Evaluate() 执行某个js,相当于控制台输入js
network.SetExtraHTTPHeaders() 截取请求,额外增加header头
chromedp.SendKeys() 模拟键盘操作,输入字符
chromedp.Nodes() 根据xpath获取某些元素,并存储进入数组
chromedp.NewRemoteAllocator
chromedp.OuterHTML() 获取元素的outer html
chromedp.Screenshot() 根据某个元素截图
page.CaptureScreenshot() 截取整个页面的元素
chromedp.Submit() 提交某个表单
chromedp.WaitNotPresent() 等候某个元素不存在,比如“正在搜索。。。”
chromedp.Tasks{} 一系列Action组成的任务

根据这些可以更好的操作chromedp
第二个是在评完后每一个提交都有弹出框,这个弹出框不属于页面元素,所以使用chromedp不好操作所以需要一个事件去监听是否有弹出框弹出,要有就关闭,但这种方法我只能操作一层弹出框,如果弹出框后再有弹出框就监听不了,所以解决这个问题我采用第一个通过监听关闭,第二个我强制刷新页面。
以下是监听弹出框的代码

//chromedp监听网页上弹出alert对话框
	chromedp.ListenTarget(ctx, func(ev interface{}) {
		if ev, ok := ev.(*page.EventJavascriptDialogOpening); ok {
			fmt.Println("closing alert:", ev.Message)
			go func() {
				//自动关闭alert对话框
				if err := chromedp.Run(ctx,
					//注释掉下一行可以更清楚地看到效果
					page.HandleJavaScriptDialog(true),
				); err != nil {
					panic(err)
				}
			}()
		}
	})

后面直接刷新网页进行跳过

chromedp.Reload()

这里也许不是很完善,希望懂得大神可以提一些意见。
第三个就是要做一个即使是代码小白也可以使用的程序,所以我做了一个前端页面,那么就会有一个问题,你在启动后端服务后,你要在本地搜索你的地址才能打开前端页面,所以这时候就应该在起动后端服务的同时开启我们的前端页面,而go中正好有可以操作的方法

我这启动的是本地服务
exec.Command(`cmd`, `/c`, `start`, `http://127.0.0.1:8080`).Start()

要让他自己打开前端页面只有这一行是不够的,这样是找不到前端页面的。
还要把前端页面放到静态文件夹里面这样才能让后端资源找到页面并打开,操作如下:
我的文件夹层级:
在这里插入图片描述
然后进行操作,让后端服务知道他们要去哪找,找谁:

router := gin.Default()
	//把所有的文件夹都设置成静态文件夹
	router.Static("/static", "./static")
	router.Static("/css", "./static/css")
	router.Static("/js", "./static/js")
	router.LoadHTMLGlob("static/index.html")
	router.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", gin.H{
			"title": "Main website",
		})
	})

之后就可以启动后端服务后打开页面了
第四是我准备把后端服务部署到服务器,但是在服务器上就看不到操作了,要想看到操作就打包成exe文件,直接在本地开启后端服务。
阿里云:https://www.aliyundrive.com/s/cqbC1ymEZLv
提取码: 8nm1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值