今年疫情原因,在家上网课,开启了无聊的刷网课模式,不光在学习通上,MOOC上也有一门创新创业。
本来网课刷的好好的开两个页面双倍快乐,一会就可以刷完,可是居然还有测验。关键是测验的题目百度查不到,要么就是恶心的付费解锁。真巧我发现有一款APP基本啥网课答案都有,就打算用这个软件完成各章的测试。可是,这居然没有web网页版所以不能用requests模块批量提交解析。
问题是如果用手机的话,要一题一题复制粘贴,然后不停的切换页面太麻烦啦。所以想着在电脑上用模拟器完成。
那啥看了一眼,要实现上述要求要用到python的Appium-Python-Client模块等等。去学了一波。
学会了我们就开始!
需要的东西:
夜神模拟器、python3(pycharm)、appium、javaSDK、以及AndroidSDK
操作步骤
1、模拟器自行百度下载最新版本我用的夜神模拟器
2、安装java sdk 自行百度记得添加环境变量因为android sdk要依赖 java sdk 环境
安装验证:cmd输入javac如下图所示即安装成功
3、下载Androidsdk建议下镜像版(因为正版要科学上网)并新建环境变量ANDROID_HOME,路径值为SDK文件所在位置
(避坑指南:注意Android adb.exe和模拟器文件夹下的nox_adb.exe以及adb.exe版本要一样可以把Androidsdk adb.exe改个名字直接复制到模拟器里避免版本冲突)
然后添加完路径之后 win+r 输入cmd打开命令行,输入adb如果如下图所示表示安装成功。
接下来打开模拟器,首先打开模拟器设置找到版本号连点7下打开开发者模式并打开USB调试选项
cmd输入指令:adb device,如图表示连接成功。
4、安装appuim (百度百度)
作为python操纵app的接口
附上原理图
5、开始编写代码
我用的是xpath语法批量采集题目到一个txt然后按行对txt的内容进行处理,这只是单纯的前端并不会与服务器交互可以安心享用(抖机灵)
下面直接贴上代码:没学过的建议看一下教程:
教程传送门:点我
from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
import time
desired_caps = {
'platformName': 'Android', # 被测手机是安卓
'platformVersion': '5', # 手机安卓版本
'deviceName': '127.0.0.1:62001', # 设备名,安卓手机可以随意填写
'appPackage': 'com.xuexiaoyi.xxy', # 启动APP Package名称
'appActivity': '.MainActivity', # 启动Activity名称
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
'resetKeyboard': True, # 执行完程序恢复原来输入法
'noReset': True, # 不要重置App
'newCommandTimeout': 6000,
'automationName' : 'UiAutomator2',
}
# 连接Appium Server,初始化自动化环境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 设置缺省等待时间
driver.implicitly_wait(15)
# 根据content-desc定位搜索输入框,点击
driver.find_element_by_accessibility_id('搜题').click()
file = open(r"C:\Users\Administrator\Desktop\imu.txt")
i = 0
for line in file:
i = i + 1
print(i, '、', line)
#加个异常处理
try:
# 根据classname定位搜索框
search = driver.find_elements_by_class_name('android.widget.EditText')[0]
search.click()
search.send_keys(line)
#定义一个滑动屏幕的函数
def up_swipe():
time.sleep(1)
driver.swipe(start_x=48, start_y=535, end_x=48, end_y=100)
time.sleep(1)
# 根据classname定位立即搜索按键
sousuo = driver.find_elements_by_class_name('android.widget.TextView')[6]
sousuo.click()
up_swipe()
time.sleep(1)
print('*' * 50)
ques = driver.find_elements_by_class_name('android.widget.TextView')[8]
print(ques.text)
#有的时候题目不一样长所以会多输出两个元素确保我们想要的题目在,无伤大雅觉得不好看的可以写一个替换函数
anwser = driver.find_elements_by_class_name('android.widget.TextView')[9]
anwser1 = driver.find_elements_by_class_name('android.widget.TextView')[10]
anwser2 = driver.find_elements_by_class_name('android.widget.TextView')[11]
print(anwser.text,anwser1.text,anwser2.text)
print('*' * 50)
#滑动回去
driver.swipe(start_x=48, start_y=268, end_x=48, end_y=800, duration=800)
clear = driver.find_elements_by_class_name('android.widget.TextView')[4]
clear.click()
time.sleep(1)
except:
print("本题需要手动搜寻答案")
file.close()
滑动的原因是答案的元素在下面,定位不到。所以需要滑动滑动记得加个延时函数避免出错。
然后就可以愉快的刷题啦耶耶耶!(小伙伴也可以把内容输出到一个txt文本中做可持续化这里就不展开了)