python自动填写提交表单_Python+selenium实现听力表单自动填写

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 01:53   46   0

前言

近期我校发来听力,网上填写,自动排名啊

填完了,发现……诶?我怎么名次这么靠后?

打开排行榜……???满分只要41s就写完了?

知道了,看来是直接抄答案啊……那么既然你们不乖,我也来吧~

计算机竞赛中学到的编程技巧,发挥作用啦~

准备工作

chromedriver + python + selenium

配置啥的自己网上找吧,搜索是必备技能来着(没有百度的,放弃百度吧<( ̄ c ̄)y▂ξ

开工

为了实现自动填写表单,首先我们要通过selenium开一个浏览器

from selenium import webdriver

driver=webdriver.Chrome()

driver.get('https://xxxxxxx') #这里填网站

这些代码可打开一个浏览器窗口

元素定位

为了做到填写表单,我们首先需要找到需要填写的元素,比如文本框。

html中,这些元素都有一个id,可以通过检查元素获得

例如,这里的姓名框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")

现在我们运行脚本,发现已经可以自动帮我们填写姓名班级了(为什么这么臭啊喂)

接下来要做的自然是填写答案啦~

发现答案使用的是单选框式,那么我们照抄网上教程的,发现复选框第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试试

可行!使用这个方法,我们就可以按下这个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的方法实现选中复选框的目的

测试

诶?明明选中了,为什么还是显示“请选择此项”呢?

看来还是有问题。继续使用console

看来问题出在这里。q2_3尽管已经click,但是checked还是在false。而手动点击后,发现checked变成了true

那么,直接把checked改成true不就行了?

实验发现,如果我们把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")

测试,完美!可以了

现在,我们只需要解决这个提交按钮了~

发现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()")

效果

一次5s,一次10s,解决了20个题目的听力~

大 胜 利

至于为什么用了5s?selenium需要打开一个chrome浏览器窗口,加载网页的时候自然就慢了。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP