前言
一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210417。
【Selenium项目实战】包含以下内容:
- 项目环境搭建:安装JDK、mysql、Tomcat和测试系统
- 需求分析和用例设计
- 项目架构设计
- 完成项目基本测试
- 解决验证码问题
- 完成项目测试用例
- (补充)实现工具类:设计获得坐标、复杂验证码识别、随机字符串、cookie操作工具类
把前面几个代码都封装在util这个目录下,这样后面用到直接调用就行了
1、util.py代码如下:
import os
import pickle
import random
import string
from time import sleep, time, strftime, localtime
import pyautogui
from PIL import Image
from pytesseract import pytesseract
from selenium import webdriver
from lib.ShowapiRequest import ShowapiRequest
# 1、定位坐标
def test_agree_radiobutton():
driver=webdriver.Chrome()
driver.get('http://www.jpress.io/user/register')
sleep(1)
el =driver.find_element_by_id('agree')
# el.click() 虽然找到了但是还是定位不到
print(el.rect) #找到该坐标打印一下
rect=el.rect
pyautogui.moveTo(rect['x']+10,rect['y']+130) #10,130 就是移动像素
pyautogui.click()
sleep(3)
# 2、抠图获取验证码
def test_yzm():
path = os.path.abspath('screenshots')
print(path)
# image1 = Image.open(path + '/' + 'yzm1.png')
# image1 = Image.open(path + '/' + 'yzm2.png')
image1 = Image.open(path + '/' + 'yzm3.png')
str = pytesseract.image_to_string(image1)
print(str)
# 3、调用AI库识别复杂验证码
def test_yzmPro():
# 先把验证码图片扣取下来
# 打开谷歌
browser = webdriver.Chrome()
browser.get('http://localhost:8080/jpress/user/register')
sleep(3)
# browser.maximize_window()
# 获取http://localhost:8080/jpress/user/register图片
path = '/Users/zhengxiaofang/PycharmProjects_py3/Selenium_project/'
path = os.path.join(path, 'screenshots')
if not os.path.exists(path): # 如果找不到/Users/ff/PycharmProjects_py3/Selenium_project/screenshots就创建
os.mkdir(path)
# 设置要截图的文件名:自定义名称+系统时间命名+后缀.png
picture_name1 = '验证码未切' + strftime('%Y_%m_%d_%H_%M_%S', localtime()) + '.png'
path = os.path.join(path, picture_name1) #截图1的路径+名称
browser.get_screenshot_as_file(path) # 截图保存
print(path)
# 找到验证码坐标,利用pil模块中的抠图方法crop,把图片抠出来,保存为picture_name2
# yzm_img = browser.find_element_by_xpath('//*[@id="captchaimg"]')
yzm_img = browser.find_element_by_id("captchaimg")
print(yzm_img.location) # 打印左上角坐标{'x': 547, 'y': 447}
left = yzm_img.location['x']
top = yzm_img.location['y']
width =yzm_img.size['width'] + left
height =yzm_img.size['height'] + top
dpr = browser.execute_script('return window.devicePixelRatio') # execute_script():执行js,使devicePixelRatio 能够返回当前显示设备的物理像素分辨率与 CSS 像素分辨率的比率
print(dpr)
# # 打开截图1
im = Image.open(path)
# 把图片抠出来,保存为picture_name2
img = im.crop((left * dpr, top * dpr, width * dpr, height * dpr))
picture_name2 = '验证码切图' + strftime('%Y_%m_%d_%H_%M_%S', localtime()) + '.png'
print(picture_name2)
img.save(picture_name2) # 这种方式图片默认是保存到main.py当前路径下
# 这里是复杂验证码获取
r = ShowapiRequest("http://route.showapi.com/184-4","602469","cff386bf98294645ab8c1acf2fc2c385") # 密钥和密码用自己的
r.addFilePara("image", picture_name2)
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息
# 取showapi_res_body中的result
body = res.json()['showapi_res_body']
print(body)
# 取出验证码
print(body['Result'])
browser.close()
# 4、生成随机字符串
def gen_random_str():
rand_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
return rand_str
def save_cookie(driver, path):
with open(path, 'wb') as filehandler:
cookies = driver.get_cookies()
print(cookies)
pickle.dump(cookies, filehandler) #保存
def load_cookie(driver, path):
with open(path, 'rb') as cookiesfile:
cookies = pickle.load(cookiesfile)
for cookie in cookies:
driver.add_cookie(cookie)
# 获取验证码图片-借鉴他人,仅供学习参考,我用这种方法打印出来的图片路径不太对劲
def get_code(driver):
# 获取验证码图片
path = os.path.dirname(os.path.dirname(__file__)) + '\\screenshots'
# 解析上面代码含义:
# os.path.dirname(__file__):获得当前文件所在路径
# os.path.dirname():上级目录
# '\\screenshots':切换到该目录下,也就是截图路径
picture_name1 = path + '\\' + str(time()) + '.png'
driver.save_screenshot(picture_name1)
ce = driver.find_element_by_xpath('//*[@id="captchaimg"]')
left = ce.location['x']
top = ce.location['y']
right = ce.size['width'] + left
height = ce.size['height'] + top
dpr = driver.execute_script('return window.devicePixelRatio')
print(dpr)
im = Image.open(picture_name1)
img = im.crop((left*dpr, top*dpr, right*dpr, height*dpr))
picture_name2 = path + '\\' + str(time()) + '.png'
img.save(picture_name2) # 这里就是截取到的验证码图片
#这里是复杂验证码获取
r = ShowapiRequest("http://route.showapi.com/184-4","602469","cff386bf98294645ab8c1acf2fc2c385") # 需要花点点钱
r.addFilePara("image", picture_name2)
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息
# 取showapi_res_body中的result
body = res.json()['showapi_res_body']
print(body)
# 取出验证码
print(body['Result'])
2、main.py代码如下:
# 这个文件是专门用来测试的
from selenium import webdriver
from util import util
if __name__ == '__main__':
# ----测试util工具类----
# 定位坐标
# util.test_agree_radiobutton()
# 抠图获取验证码
# util.test_yzm()
# 调用AI库识别复杂验证码
# util.test_yzmPro()
# 随机获取字符串
# print(util.gen_random_str())
# 获取某个页面的验证码
driver = webdriver.Chrome()
driver.get('http://localhost:8080/jpress/user/register')
driver.maximize_window()
util.get_code(driver)
print(util.get_code(driver))
driver.quit()