一、Python环境
1.1安装环境
双击打开下载好的Python安装包如下界面,选择“Customize installation”个性化安装,然后“Add Python 3.7 to PATH”暂时不选,我们之后手动添加路径感受一下,或者你为了省去麻烦,可以直接勾选。
点击之后进入子页面“Optional Features”,各个选项都帮我们勾选上了,直接“next” 。然后进入“Advanced Options”页面,我们将“Install for all users”勾选上,这时自动勾选了“Precompile standard library”,然后我们再点击“Browse”更改安装位置,开始安装即可。
1.2.配置环境
Windows11系统中搜索编辑系统环境变量
点击环境变量
双击“系统变量”中的“path”,点击“新建”增加python路径“D:\Software\soft\Python37”和pip路径 “D:\Software\soft\Python37\Scripts”,改为你的安装位置。
3.检查安装情况
使用win+r键输入cmd进入命令提示符(或者win11搜索命令提示符)
输入python显示python的版本号即安装成功
二、安装pip第三方库
2.1安装pip
输入pip3 –version查看pip的版本
若没有则在windows下安装pip: 在安装python目录的scirpts下运行easy_install pip进行安装
刚安装完可能需要自身升级:python -m pip install -U pip
2.2安装爬虫所需库
下载selenium:pip install selenium,如果安装总失败可以用国内镜像网站:pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
下载Urllib:pip install Urllib,如果安装总失败可以用国内镜像网站:pip install Urllib-i Simple Index
下载pyautogui:pip install pyautogui,如果安装总失败可以用国内镜像网站:pip install pyautogui-i Simple Index
三、对于库的解读
3.1对于selenium库的了解
selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。
3.1.1selenium简介
selenium是一个用于web应用程序自动化测试工具,可以直接运行在浏览器,就行用户真正的在浏览器操作一样,支持的浏览器包括:IE,Firefox,Chrome,Safari
主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。
3.1.2selenium原理(3个)
1.测试脚本:python,java编写脚本程序
2.浏览器驱动:不同的驱动对应不同的版本
3.浏览器:IE,Firefox,Chrome,Safari
3.1.3selenium工作过程
1.对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
2.浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
3.HTTP Server接收到请求后根据请求来具体操控对应的浏览器
4.浏览器执行具体的测试步骤
5.浏览器将步骤执行结果返回给HTTP Server
6.HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息
3.1.4.selenium自动化测试流程
1.分析需求
2.制定测试计划
3.设计用例
4.搭建测试框架(公用对象,公用环境,公用方法,工公用测试数据)
5.编写脚本
6.分析测试结果
7.维护测试脚本
3.1.5UI自动化本质
定位元素–操作元素–模拟页面操作–断言–测试报告
3.1.6UI自动化的前提
1.需求不能频繁动
2.UI稳定
3.项目周期长
4.回归测试频繁
3.1.7适用场景
冒烟测试,回归测试
3.1.8UI自动化的原则
1.一个case完成一个功能测试(可以从功能用例摘除可以自动化的禁行标识)
2.一个脚本是一个完整的业务场景
3.每个脚本可以独立运行,没有依赖关系
4.设计合适的检查点
5.设计良好的框架
3.1.9UI自动化的覆盖率
是根据项目来说,并不是占比越高越好,会受到项目周期,迭代次数等影响
3.1.10selenium优点
1.开源,免费
2.支持多种浏览器IE,Firefox,Chrome,Safari
3.支持多平台 Windows,Linux,Mac
4.支持多语言 python,java,c
5.对web支持良好
6.简单,灵活
7.支持分布式测试用例执行
3.1.11selenium定位方式
from selenium import webdriver
driver = driver.chrome()
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_xpth()
driver.find_element_by_css_selector()
3.1.12框架设计:
我们来思考下框架组成部分:
1)需要配置文件管理
2)业务逻辑代码和测试脚本分离
3)报告和日志文件输出
4)自定义的库的封装
5)管理、执行脚本方式
6)第三方插件引入
7)持续集成
解释:
我们需要一个配置文件去控制一些,环境信息,开关,配置文件可以是txt/xml/yaml/properties/ini,一般.properties使用较多在JAVA里,本文是Python系列,我可能会选择ini文件。
业务逻辑代码和测试脚本分离,不像我们刚开始学习Selenium那样,代码和脚本在一个类文件里演示。我们根本没有用到代码重构,复用。代码和用例文件分离后,更加清晰,去多人开发脚本,方便调试。
报告和日志文件输出,你执行了多少case,case结果如何,这都需要报告来展示,一般采用第三方插件来实现这个功能,好多报告格式是html,简单,明了的风格。日志输出也很重要,如果发生报错,脚本执行失败,通过日志快速定位发生问题位置。
用户自定义库,这个很好理解,我们很多功能需要重复调用,这样我们就写成一个公用方法,放到工具包下,每次方便调用,例如浏览器引擎类和basepage.py的封装。
管理和执行脚本的方式,例如Python中单元测试框架unittest使用率非常高。
第三方插件,有时候,我们一些功能,需要借助第三方插件,能够更好实现,例如AutoIT,来实现文件上传和下载。还有利用第三方报告插件生成基于html格式的测试报告。
持续集成,git,svn,ant,maven,jenkins,我们会把这整合到jenkins,达到持续集成,一键执行测试脚本。
结论:
配置元件:配置文件与全局环境变量
框架的主要代码:日志类,封装,调用,配置文件读取
产品业务:核心思想,页面对象,业务逻辑分层
测试脚本集合:管理和创建业务测试单元
日志和报告:报告输出
测试集成和其他:Jenkins集成或者其他
3.2Urllib3库
Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:
1、线程安全
2、连接池
3、客户端SSL/TLS验证
4、文件分部编码上传
5、协助处理重复请求和HTTP重定位
6、支持压缩编码
7、支持HTTP和SOCKS代理
8、100%测试覆盖率
3.3 PyAutoGUI库
PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,利用它可以实现自动化任务。让所有GUI都自动化,本教程译自大神Al Sweigart的PyAutoGUI项目,Python自动化工具,更适合处理GUI任务,网页任务推荐。PyAutoGUI可以模拟鼠标的移动、点击、拖拽,键盘按键输入、按住操作,以及鼠标+键盘的热键同时按住等操作,可以说手能动的都可以。
3.3.1常用操作
我们在pyautogui库中常常使用的方法,如下
import pyautogui
pyautogui.PAUSE = 1 # 调用在执行动作后暂停的秒数,只能在执行一些pyautogui动作后才能使用,建议用time.sleep
pyautogui.FAILSAFE = True # 启用自动防故障功能,左上角的坐标为(0,0),将鼠标移到屏幕的左上角,来抛出failSafeException异常
# 判断(x,y)是否在屏幕上
x, y = 122, 244
pyautogui.onScreen(x, y) # 结果为true
width, height = pyautogui.size() # 屏幕的宽度和高度
print(width, height)
3.3.2鼠标操作
我们在pyautogui库对于鼠标的使用方法大体如下
import pyautogui
currentMouseX, currentMouseY = pyautogui.position() # 鼠标当前位置
print(currentMouseX, currentMouseY)
# 控制鼠标移动,duration为持续时间
for i in range(2):
pyautogui.moveTo(100, 100, duration=0.25) # 移动到 (100,100)
pyautogui.moveTo(200, 100, duration=0.25)
pyautogui.moveTo(200, 200, duration=0.25)
pyautogui.moveTo(100, 200, duration=0.25)
for i in range(2):
pyautogui.moveRel(50, 0, duration=0.25) # 从当前位置右移100像素
pyautogui.moveRel(0, 50, duration=0.25) # 向下
pyautogui.moveRel(-50, 0, duration=0.25) # 向左
pyautogui.moveRel(0, -50, duration=0.25) # 向上
# 按住鼠标左键,把鼠标拖拽到(100, 200)位置
pyautogui.dragTo(100, 200, button='left')
# 按住鼠标左键,用2秒钟把鼠标拖拽到(300, 400)位置
pyautogui.dragTo(300, 400, 2, button='left')
# 按住鼠标左键,用0.2秒钟把鼠标向上拖拽
pyautogui.dragRel(0, -60, duration=0.2)
# pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left')
# 其中,button属性可以设置成left,middle和right。
pyautogui.click(10, 20, 2, 0.25, button='left')
pyautogui.click(x=100, y=200, duration=2) # 先移动到(100, 200)再单击
pyautogui.click() # 鼠标当前位置点击一下
pyautogui.doubleClick() # 鼠标当前位置左击两下
pyautogui.doubleClick(x=100, y=150, button="left") # 鼠标在(100,150)位置左击两下
pyautogui.tripleClick() # 鼠标当前位置左击三下
pyautogui.mouseDown() # 鼠标左键按下再松开
pyautogui.mouseUp()
pyautogui.mouseDown(button='right') # 按下鼠标右键
pyautogui.mouseUp(button='right', x=100, y=200) # 移动到(100, 200)位置,然后松开鼠标右键
# scroll函数控制鼠标滚轮的滚动,amount_to_scroll参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动
# pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)
pyautogui.scroll(5, 20, 2)
pyautogui.scroll(10) # 向上滚动10格
pyautogui.scroll(-10) # 向下滚动10格
pyautogui.scroll(10, x=100, y=100) # 移动到(100, 100)位置再向上滚动10格
# 缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。
# PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。
# 开始很慢,不断加速
pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)
# 开始很快,不断减速
pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)
# 开始和结束都快,中间比较慢
pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)
# 一步一徘徊前进
pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)
# 徘徊幅度更大,甚至超过起点和终点
pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)
对于我们要获取鼠标在屏幕中的位置,我们可以采用如下代码:
# 案例获取鼠标的位置,方便复制我们定位的鼠标坐标点到代码中
import pyautogui
import time
获取鼠标位置
def get_mouse_positon():
time.sleep(5) # 准备时间
print('开始获取鼠标位置')
try:
for i in range(10):
# Get and print the mouse coordinates.
x, y = pyautogui.position()
positionStr = '鼠标坐标点(X,Y)为:{},{}'.format(str(x).rjust(4), str(y).rjust(4))
pix = pyautogui.screenshot().getpixel((x, y)) # 获取鼠标所在屏幕点的RGB颜色
positionStr += ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(
3) + ')'
print(positionStr)
time.sleep(0.5) # 停顿时间
except:
print('获取鼠标位置失败')
if __name__ == "__main__":
get_mouse_positon()
也可以使用pyautogui库帮助文档的方法,不过本人认为使用上面的方法,更加便利。pyautogui库帮助文档的获取鼠标位置的方法如下:
import pyautogui
print('Press Ctrl-C to quit.')
try:
while True:
# Get and print the mouse coordinates.
x, y = pyautogui.position()
positionStr = 'X:' + str(x).rjust(4) + ' Y:' + str(y).rjust(4)
pix = pyautogui.screenshot().getpixel((x, y)) # 获取鼠标所在屏幕点的RGB颜色
positionStr += ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr, end='') # end='' 替换了默认的换行
print('\b' * len(positionStr), end='', flush=True) # 连续退格键并刷新,删除之前打印的坐标,就像直接更新坐标效果
except KeyboardInterrupt: # 处理 Ctrl-C 按键
print('\nDone.')
3.3.4键盘操作
我们在pyautogui库对于键盘的使用方法大体如下
import pyautogui
pyautogui.typewrite('Hello world!') # 输入Hello world!字符串
pyautogui.typewrite('Hello world!', interval=0.25) # 每次输入间隔0.25秒,输入Hello world!
pyautogui.press('enter') # 按下并松开(轻敲)回车键
pyautogui.press(['left', 'left', 'left', 'left']) # 按下并松开(轻敲)四下左方向键
pyautogui.keyDown('shift') # 按下`shift`键
pyautogui.keyUp('shift') # 松开`shift`键
pyautogui.keyDown('shift')
pyautogui.press('4')
pyautogui.keyUp('shift') # 输出 $ 符号的按键
pyautogui.hotkey('ctrl', 'v') # 组合按键(Ctrl+V),粘贴功能,按下并松开'ctrl'和'v'按键
# pyautogui.KEYBOARD_KEYS数组中就是press(),keyDown(),keyUp()和hotkey()函数可以输入的按键名称
pyautogui.KEYBOARD_KEYS = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.',
'/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@',
'[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback',
'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch',
'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal',
'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22',
'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul',
'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2',
'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9',
'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print',
'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select',
'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command',
'option', 'optionleft', 'optionright']
3.3.5弹窗操作
我们在pyautogui库对于弹出窗口的使用方法大体如下:
import pyautogui
# 显示一个简单的带文字和OK按钮的消息弹窗。用户点击后返回button的文字。
pyautogui.alert(text='', title='', button='OK')
b = pyautogui.alert(text='要开始程序么?', title='请求框', button='OK')
print(b) # 输出结果为OK
# 显示一个简单的带文字、OK和Cancel按钮的消息弹窗,用户点击后返回被点击button的文字,支持自定义数字、文字的列表。
pyautogui.confirm(text='', title='', buttons=['OK', 'Cancel']) # OK和Cancel按钮的消息弹窗
pyautogui.confirm(text='', title='', buttons=range(10)) # 10个按键0-9的消息弹窗
a = pyautogui.confirm(text='', title='', buttons=range(10))
print(a) # 输出结果为你选的数字
# 可以输入的消息弹窗,带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.prompt(text='', title='', default='')
# 样式同prompt(),用于输入密码,消息用*表示。带OK和Cancel按钮。用户点击OK按钮返回输入的文字,点击Cancel按钮返回None。
pyautogui.password(text='', title='', default='', mask='*')
四、安装浏览器驱动
查看自己浏览器版本号
找寻浏览器对应的版本
安装到python的根目录下
并在此创建一个文件夹存储音乐mp3,将三个文件放入一个文件夹中
五、执行文件
使用
打开游戏的.py文件
点击File->Open ..找到文件的位置
点击Run->Run Module
代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import urllib
import pyautogui as pg
driver = webdriver.Chrome() #创建一个浏览器
driver.get("http://www.5nd.com/") # 打开一个指定的网址
pic=driver.find_elements(By.XPATH,"//a[@class='__playcolor']") #根据class属性查找所有的a链接
#注意这里是find_elements,表示查找多个元素
for one in pic:
name=one.get_attribute("title") #获得查找到的元素的属性值
one.click() #点击查到到的元素
time.sleep(2)
n = driver.window_handles # 获取当前页句柄
driver.switch_to.window(n[1]) #切换到新窗口
mp3=driver.find_element(By.XPATH,"//audio[@preload='metadata']") #根据preload属性查找audio元素
#注意这里是find_element,表示查找单个元素
sx=mp3.get_attribute("src") #获得src属性值,也就是下载的链接
urllib.request.urlretrieve(sx,'mp3/%s.mp3'%name) #下载指定的文件到mp3文件夹下
pg.hotkey("ctrl","w") #发送快捷键关闭窗口
driver.switch_to.window(n[0]) #切换到原窗口
time.sleep(0.5)
driver.quit() #退出浏览器