前言
![9a984950b0fc83644ff6dfd526a79035.png](https://i-blog.csdnimg.cn/blog_migrate/6ff080fa21d7e7ff019bdc471d182800.jpeg)
近期我校发来听力,网上填写,自动排名啊
填完了,发现……诶?我怎么名次这么靠后?
打开排行榜……???满分只要41s就写完了?
![45591c26d28fcb8a53124db28a19b3ff.png](https://i-blog.csdnimg.cn/blog_migrate/3f5168e1f85f9dd76a2549e89806604d.png)
知道了,看来是直接抄答案啊……那么既然你们不乖,我也来吧~
计算机竞赛中学到的编程技巧,发挥作用啦~
准备工作
chromedriver + python + selenium
配置啥的自己网上找吧,搜索是必备技能来着(
![6df96efc9b8ba816aee6d92acba1ed65.png](https://i-blog.csdnimg.cn/blog_migrate/d61e737b23fc5396375680b88ac8c627.jpeg)
开工
为了实现自动填写表单,首先我们要通过selenium开一个浏览器
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://xxxxxxx') #这里填网站
这些代码可打开一个浏览器窗口
元素定位
为了做到填写表单,我们首先需要找到需要填写的元素,比如文本框。
html中,这些元素都有一个id,可以通过检查元素获得
![84cc6971fb42ee00451cd6bc03349375.png](https://i-blog.csdnimg.cn/blog_migrate/c353c800f7c8a96410d520e4c5469eef.jpeg)
例如,这里的姓名框id就是q1_0
要给文本框发送数据,我们只需要使用send_keys函数
name = driver.find_element_by_id("q1_0")
name.send_keys("野兽先辈")
classname = driver.find_element_by_id("q1_1")
classname.send_keys("114514")
现在我们运行脚本,发现已经可以自动帮我们填写姓名班级了(为什么这么臭啊喂)
![210aaca1f769b473e08090fdcea98cf8.png](https://i-blog.csdnimg.cn/blog_migrate/094f9e80630484fc95b23bf7089fc136.jpeg)
接下来要做的自然是填写答案啦~
![d15846a35977e598b7c5bdbd2fd7097f.png](https://i-blog.csdnimg.cn/blog_migrate/07a0d361a761adc54240b2ec51ff1695.jpeg)
发现答案使用的是单选框式,那么我们照抄网上教程的,发现复选框第i题的第k个选项有规律,id是"q"+str(i+1)+"_"+str(k)
那么,非常好写了, 我们使用click命令~
answer="xxBCBABCABAACCBBCACACA" #答案“数组”
mp = {}
mp["A"]="1"
mp["B"]="2"
mp["C"]="3"
for i in range(2,22):
driver.driver.find_element_by_id("q" + str(i) + "_" + mp[answer[i]]).click()
测试,结果发现,什么都没有填~
诶?明明网上的教程说,
从上例可以看出我们对这种checkbox和radio,可以通过直接点击或者发送空格的方式达到选中或者反选的目的。
看来不行,这里的单选框比较特殊。
靠着自己那1/n桶水的Javascript,我们打开浏览器的console,直接输入script试试
![c145b5a6aed1daa7745634ec939311e3.png](https://i-blog.csdnimg.cn/blog_migrate/973a95b932d0fafe7983967f0de78334.jpeg)
可行!使用这个方法,我们就可以按下这个radio了
修改代码如下
answer="xxBCBABCABAACCBBCACACA" #答案“数组”
mp = {}
mp["A"]="1"
mp["B"]="2"
mp["C"]="3"
for i in range(2,22):
driver.execute_script("q" + str(i) + "_" + mp[answer[i]] + ".click()")
通过直接发送script的方法实现选中复选框的目的
测试
![e7af34582bc60caae8594b13ceaf5481.png](https://i-blog.csdnimg.cn/blog_migrate/39890cc7b07986cda457d29132906476.jpeg)
诶?明明选中了,为什么还是显示“请选择此项”呢?
看来还是有问题。继续使用console
![96709ae3d112a5739497459a660192be.png](https://i-blog.csdnimg.cn/blog_migrate/e07724c8e6efb32955f2871c38fc4be0.png)
看来问题出在这里。q2_3尽管已经click,但是checked还是在false。而手动点击后,发现checked变成了true
那么,直接把checked改成true不就行了?
![f0ac63136888b045dc0870fc979a0a9c.png](https://i-blog.csdnimg.cn/blog_migrate/440484a16d082a5cc8c2ded30c813609.jpeg)
实验发现,如果我们把checked改为true,即使“没有选择”它还是没有提示请选择此项
那么,代码就出来了
answer="xxBCBABCABAACCBBCACACA"
mp = {}
mp["A"]="1"
mp["B"]="2"
mp["C"]="3"
for i in range(2,22):
driver.execute_script("q" + str(i) + "_" + mp[answer[i]] + ".click()")
#保险起见,没有删除这段代码(其实是懒(划掉))
for i in range(2,22):
driver.execute_script("q" + str(i) + "_" + mp[answer[i]] + ".checked=true")
测试,完美!可以了
现在,我们只需要解决这个提交按钮了~
![b88b0c13c269e3ee755aba0383ceae43.png](https://i-blog.csdnimg.cn/blog_migrate/e9d2fbbd9eb2e3a9020a6d26f8930b5c.png)
发现id为ctlNext。那么,对于按钮直接调用click即可。
代码
久 等 了
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('https://ks.wjx.top/m/xxxxxxxxx.aspx') #和谐啦
name = driver.find_element_by_id("q1_0")
name.send_keys("野兽先辈")
classname = driver.find_element_by_id("q1_1")
classname.send_keys("114514")
answer="xxBCBABCABAACCBBCACACA"
mp = {}
mp["A"]="1"
mp["B"]="2"
mp["C"]="3"
for i in range(2,22):
driver.execute_script("q" + str(i) + "_" + mp[answer[i]] + ".click()")
for i in range(2,22):
driver.execute_script("q" + str(i) + "_" + mp[answer[i]] + ".checked=true")
driver.execute_script("ctlNext.click()")
效果
![ef55452d239df37cb4c15126151b0f9f.png](https://i-blog.csdnimg.cn/blog_migrate/e06837e8b8eeeaa2d97b4447abb3ae83.png)
一次5s,一次10s,解决了20个题目的听力~
大 胜 利
至于为什么用了5s?selenium需要打开一个chrome浏览器窗口,加载网页的时候自然就慢了。