selenium3与Python3实战 web自动化测试框架 ☝☝☝
selenium3与Python3实战 web自动化测试框架
selenium3与Python3实战 web自动化测试框架 学习 教程
一、环境搭建
1、selenium环境搭建
Client:
- pycharm
- python3.6
Driver:
- Chrome → ChromeDriver
- Firefox → FirefoxDriver
- IE → InternetExplorerDriver
Selenium
1.1、Selenium安装
pip install selenium # 安装
from selenium import webdriver # 导入
driver = webdriver.Chrome() # 启动谷歌浏览器
driver.get("http://www.baidu.com") # 打开百度网址
# 注意:启动谷歌浏览器前需要配置好谷歌浏览器中间件 ,从网上下载chromedriver.exe ,将其放置到python的安装目录下
1.2、使用脚本启动不同浏览器
启动浏览器前需配置好浏览器对应driver:
- Chrome --chromedriver.exe :谷歌浏览器调试驱动插件
- Firefox --geckodrive.exe : 火狐浏览器调试驱动插件
- IE --MicrosoftWebDriver.exe : IE浏览器调试驱动插件
将上面三个exe文件下载后放置到python目录下
1)启动谷歌浏览器
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
2)启动火狐浏览器:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
3)启动IE浏览器
from selenium import webdriver
driver = webdriver.Ie()
# driver = webdriver.Edge() # win 10版本启动IE浏览器,使用此行代码
driver.get('http://www.baidu.com')
2、使用expected_condition下的 title_contains判断页面标题是否与我们想要的一致,如判断页面标题是否有‘注册’字眼:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
import time
driver = webdriver.Chrome()
# driver = webdriver.Edge() # win 10版本启动IE浏览器,使用此行代码
driver.get('http://www.5itest.cn/register')
time.sleep(5)
is_live = expected_conditions.title_contains('注册') # 判断页面的标题中是否有注册两字
print('is_live:',is_live)
返回结果:
is_live: <selenium.webdriver.support.expected_conditions.title_contains object at 0x000000000354DEF0> # 存在
3、使用不同方式进行定位
访问注册链接:http://www.5itest.cn/register ,进行测试
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.5itest.cn/register')
driver.find_element_by_id('register_email').send_keys("nan@163.com") # 填写邮箱
user_name_node = driver.find_elements_by_class_name('controls')[1] # 使用classname进行定义,需要细心处理
user_name_node.find_element_by_class_name('form-control').send_keys('Eric_nan') # 填写用户名
driver.find_element_by_name('password').send_keys('111111') # 填写密码
driver.find_element_by_xpath('//*[@id="captcha_code"]').send_keys('2222') # 填写验证码
脚本控制启动浏览器并访问注册页面,同时自动输入我们设定的值:
4、使用expected_conditions判断元素是否可见
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
locator = (By.CLASS_NAME,'controls') # 通过classname的方式 找到 controls
WebDriverWait(driver,1).until(expected_conditions.visibility_of_element_located(locator))
# WebDriverWait: 传入两个参数,一个是driver,另一个是超时时间(int类型)
# visibility_of_element_located:只在可见的元素里找对应的元素。如有返回内存地址
5、如何解决验证码自动输入
1)将注册页面全屏截图保存(使用driver.save_screenhot方法),再将验证码部分区域截图保存下来
打开本地图片、截取部分区域需要用到PIL ,安装:pip install -i
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 项目首路径
image_path = os.path.join(base_dir,'Image','imooc.png') # 图片路径,用于保存全屏截图后的图片
code_path = os.path.join(base_dir,'Image','code.png') # 验证码图片保存路径
driver.get('http://www.5itest.cn/register')
driver.save_screenshot(image_path) # 全屏截图
code_element = driver.find_element_by_id("getcode_num") # 定位到验证码所在的文字
# print(code_element.location) # 获取该元素(图片)左上角的(x,y)坐标
# print(code_element.size) # 获取该元素(图片)长度、宽度
left_x = code_element.location['x'] # 左上角x值
top_y = code_element.location['y'] # 左上角y值
right_x = left_x + code_element.size['width'] # 右下角x值
right_y = top_y + code_element.size['height'] # 右下角y值
im = Image.open(image_path) # 使用PIL下的Image打开下载的imooc.png图片
img = im.crop((left_x,top_y,right_x,right_y)) # 将指定的某部分裁剪出来
img.save(code_path) # 保存
2)使用 showapiRequest解决图片验证码识别
①、使用pytesseract识别图片中得问题
安装:pip install pytesseract
import pytesseract
from PIL import Image
image = Image.open("E:/imooc2.png")
text = pytesseract.image_to_string(image) # 将图片文字转换成字符串
print(text)
# 缺点:机械性读取,无法读取图片中不规则的字体,不适合于干扰性比较强的验证码图片文字读取
选择:验证码识别英数_文件 ,找到请求示例,下载SDK:ShowapiRequest.py
将 ShowapiRequest.py文件放到项目中,新建read_code_img.py文件,用于读取图片中的验证码:
验证码:
from setting.ShowapiRequest import ShowapiRequest
from setting import setting
r = ShowapiRequest("http://route.showapi.com/184-4","62666","d61950be50dfgjnr9969f741b8e730f5" )
# ShowapiRequest 的第一个参数是万维易源网的url ,第二个参数是易源网上你个人的appId , 第三个参数是易源网上的密钥
r.addBodyPara("typeId", "35") #typeId:表示识别几位数的图片验证码 ;35:'3'表示英数结合的验证码,'5'表示5位数的验证码 ; 31:一位数的验证码
r.addBodyPara("convert_to_jpg", "0")
r.addFilePara("image", setting.code_path) # 添加要识别验证码的图片
res = r.post()
print(res.text) # {"showapi_res_error":"","showapi_res_id":"6f0e4cdb977141b293ea12178ad3d37e","showapi_res_code":0,"showapi_res_body":{"Id":"5bac83cc-5637-4e2d-bc91-25a78b527241","Result":"ANLZZ","ret_code":0}}
text = res.json()['showapi_res_body']['Result']# 以json格式读取:showapi_res_body 下 Result 的值
print(text) # 返回信息:ANLZZ (识别正确)
注:这种方式识别准确率比较高
将注册相关代码封装起来-初次封装
注册自动输入对应信息
6、封装读取配置文件方法
新建int配置文件:
#localElement.ini文件
[RegisterElement]
user_email=id>register_email
user_email_error=id>register_email-error
user_name=id>register_nickname
user_name_error=id>register_nickname-error
password=id>register_password
password_error=id>register_password-error
code_image=id>getcode_num
code_text=id>captcha_code
code_text_error=id>captcha_code-error
register_button=id>register-btn
使用python3自带 configparser模块, 用于读取配置文件信息:
from setting.setting import config_ini_dir
import configparser
class Read_Ini(object): # 初始化
def __init__(self,node = None):
if node:
self.node = node
else:
self.node = 'RegisterElement' # 配置文件中的某个节点
self.cf = self.load_ini()
def load_ini(self): # 加载文件
cf = configparser.ConfigParser() # 使用 configparser模块读取配置文件信息
cf.read(config_ini_dir) # 配置文件所在路径
return cf
def get_value(self,key): # 获取配置文件中key的value值
data = self.cf.get(self.node,key)
return data
# if __name__ == '__main__':
# read_init = Read_Ini()
# print(read_init.get_value('user_name')) # 结果:id>register_nickname
7、封装定位元素类
# find_element.py
from util.read_ini import Read_Ini
class FindElement(object):
def __init__(self,driver):
self.driver = driver
def get_element(self,key):
read_ini = Read_Ini()
data = read_ini.get_value(key)
by,value = data.split('>')
try:
if by == 'id':
return self.driver.find_element_by_id(value)
elif by == 'name':
return self.driver.find_element_by_name(value)
elif by == 'className':
return self.driver.find_element_by_class_name(value)
elif by == 'xpath':
return self.driver.find_element_by_xpath(value)
else:
return self.driver.find_element_by_css(value)
except Exception as e:
print("find_element错误信息:",e)
return None
* 注册完整流程
1、配置文件
1)LocalElement.ini:存定位元素信息
LocalElement.ini
2)setting.py:
setting.py
3)read_ini.py:读取配置文件LocalElement.py的配置信息
read_ini.py
4)find_element.py:获取元素定位信息
find_element.py
5)register_function.py:注册测试主程序
register_function.py
selenium3与Python3实战 web自动化测试框架 ☝☝☝的更多相关文章
- selenium3与Python3实战 web自动化测试框架✍✍✍
selenium3与Python3实战 web自动化测试框架 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架
基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架 by:授客 QQ:1033553122 博客:http://blog.sina.com.cn/ishou ...
- 【python3+request】python3+requests接口自动化测试框架实例详解教程
转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...
- Windows环境搭建Web自动化测试框架Watir
Windows环境搭建Web自动化测试框架Watir 一.前言 Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将We ...
- Web 自动化测试框架 sweetest 介绍
项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...
- Web自动化测试框架Watir(基于Ruby) - 第2章 使用Watir写自动化测试脚本
一.先来看一个小DEMO 通过上一篇博文<Web自动化测试框架Watir(基于Ruby) - 第1章 Windows下安装与部署>的介绍,我们已经有了完整Watir运行环境,现在我们可以来 ...
- Web自动化测试框架Watir(基于Ruby) - 第1章 Windows下安装与部署
一.前言 Web自动化测试一直是一个比较迫切的问题,对于现在web开发的敏捷开发,却没有相对应的敏捷测试,故开此主题,一边研究,一边将Web自动化测试应用于工作中,进而形成能够独立成章的博文,希望能够 ...
- web自动化测试框架总结
web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09
- Web自动化测试框架改进
Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...
随机推荐
- Python默认参数
在python函数中, 可以使用如下方式声明并初始化参数 def to_smash(total_candies, n_friends=3): """Return the ...
- Intellij IDEA使用restclient测试
Intellij IDEA内置了restclient来帮忙我们测试我们的后台代码,让我们可以脱离第三方工具测试,也更不需要我们编写前端代码,直接让我们能想网站发送get,post,put,delet ...
- 讲解开源项目:让你成为灵魂画手的 JS 引擎:Zdog
本文作者:HelloGitHub-kalifun HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 如何在spingboot项目中自定义自己的配置
在实际开发中,为了方便我们常常会考虑把配置文件的某一类配置映射到配置类上,方便spring容器加载,实现方法如下: 1. 书写配置文件信息:书写某一类特定字段开头的配置信息,例如在yml配置文件中可以 ...
- Python--使用四种随机方法(Random)来产生随机价格
import random # 卖橘子的计算器:写一段代码,提示用户输入橘子的价格,# 然后随机生成购买的斤数(5到10斤之间),最后计算出应该支付的金额! # 第一种# orange_price = ...
- java动态代理之CGLIB实现
动态代理(CGlib 与连接池的案例) Cglib代理: 针对类来实现代理,对指定目标 产生一个子类 通过方法拦截技术拦截所有父类方法的调用. 我们要使用cglib代理必须引入 cglib的jar包 ...
- charles 自动存储/auto_save
本文参考:charles 自动存储 自动保存工具 auto_save "自动保存"工具会在你设定的间隔后,自动保存并清除抓取到的内容.假设你设置了3分钟,则每隔三分钟会保存一次, ...
- 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(中)
引言 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 因此数据湖相关服务 ...
- C++ const 引用 指针
先简单回忆一下常量的性质: int main() { const int buffSize = 512; buffsize = 512; //× buffSize是常量 } 初始化时: const i ...
- 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击
昨天 22:00~22:30 左右与 23:30~00:30 左右,有1台服役多年的阿里云负载均衡突然失灵,造成通过这台负载均衡访问博客站点的用户遭遇 502, 503, 504 ,由此给您带来麻烦, ...