selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装
学习目的:
掌握自动化框架中需要的一些基础web操作
正式步骤:
使用title_contains检查页面是否正确
# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC dr = webdriver.Chrome()
url = "https://www.baidu.com"
dr.get(url)
#校验title是否包含校验的内容
a = EC.title_contains("百度一下,你就知道")
#如果包含括号内的内容,则会打印
if a:
print("title正确")
time.sleep(3)
dr.close()
使用Expected_conditions判断元素是否可见
# -*- coding:utf-8 -*- import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By url = "http://www.5itest.cn/register"
dr = webdriver.Chrome()
dr.get(url)
time.sleep(3)
EC.title_contains("注册") #注册输入操作,如果用element直接传参到WebDriverWait会报错,提示需要传入一个可迭代对象,而不是webelement,所以传入locator
element = dr.find_element_by_xpath('//*[@id="register_email"]')
locator = (By.XPATH,'//*[@id="register_email"]')
WebDriverWait(dr,10).until(EC.visibility_of_element_located(locator))
element.send_keys("111@163.com") time.sleep(3)
dr.close()
获取定位的标签属性或者输入的内容
# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC url = "http://www.5itest.cn/register"
dr = webdriver.Chrome()
dr.get(url)
time.sleep(3)
EC.title_contains("注册") email_element = dr.find_element_by_xpath('//*[@id="register_email"]')
#打印定位了email的标签其他元素属性
print(email_element.get_attribute("placeholder"))
email_element.send_keys("test@163.com")
#获取输入的内容,查看是否输入正确
text = email_element.get_attribute("value")
assert text == "test@163.com" time.sleep(1)
dr.quit()
随机生成数据:用户名、邮箱账号
# -*- coding:utf-8 -*-
import random
import time
from selenium import webdriver url = "http://www.5itest.cn/register"
dr = webdriver.Chrome()
dr.get(url)
time.sleep(3)
#Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
data_email = ''.join(random.sample("123456789abcdefg",6))+'@163.com'
data_name = ''.join(random.sample("AaBbCcDdEeFf",4))
dr.find_element_by_xpath('//*[@id="register_email"]').send_keys(data_email)
dr.find_element_by_xpath('//*[@id="register_nickname"]').send_keys(data_name)
time.sleep(3)
dr.close()
解决验证码--获取验证码图片
# -*- coding:utf-8 -*- import time
import random
from PIL import Image
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait url = "http://www.5itest.cn/register"
dr = webdriver.Chrome()
dr.get(url)
dr.maximize_window()
time.sleep(3)
element_email = dr.find_element_by_xpath('//*[@id="register_email"]')
elemant_name = dr.find_element_by_xpath('//*[@id="register_nickname"]')
elemant_pwd = dr.find_element_by_xpath('//*[@id="register_password"]')
data_email = ''.join(random.sample('asdzxc123456',6))
data_name = ''.join(random.sample('BNMGHJ',4))
locator = (By.XPATH,'//*[@id="register_email"]')
WebDriverWait(dr,10).until(EC.visibility_of_element_located(locator))
element_email.send_keys(data_email+'@163.com')
elemant_name.send_keys(data_name)
elemant_pwd.send_keys('') #图片处理
dr.save_screenshot(r"F:\python_stack\python_autotest\num.png")
element_code = dr.find_element_by_xpath('//*[@id="getcode_num"]')
print(element_code.location)
code_left = element_code.location['x']
code_top = element_code.location['y']
code_right = element_code.size['width']+code_left
code_bottom = element_code.size['height'] + code_top
#打开页面的截图
im = Image.open("F:/python_stack/python_autotest/num.png")
#根据上下左右的坐标,来截取验证码图片
img = im.crop((code_left,code_top,code_right,code_bottom))
img.save("F:/python_stack/python_autotest/num_code.png") time.sleep(3)
dr.close()
从验证码图片获取验证码
import pytesseract
from PIL import Image img = Image.open("F:/python_stack/python_autotest/num_code.png")
text = pytesseract.image_to_string(img)
print(text)
PS:
如果报错:tesseract is not installed or it's not in your path
请自己下载一个Tesseract-OCR
可以参考:https://blog.csdn.net/qq_42184699/article/details/92575404
重构封装读取配置文件方法
配置文件内容:
[RegisterElement]
element_email=id>register_email
elemant_name=id>register_nickname
elemant_pwd=id>register_password
[/RegisterElement]
读取配置文件代码:
# -*- coding:utf-8 -*-
'''
pip install Configparser 安装参数解析读取的包
''' import configparser class ReadIni(object):
def __init__(self,filename = None,node= None):
if filename == None:
filename = "F:/python_stack/python_autotest/config/LocalElement.ini"
if node == None:
self.node = "RegisterElement"
else:
self.node = node
self.cf = self.load_ini(filename)
#加载文件
def load_ini(self,filename):
cf = configparser.ConfigParser()
cf.read(filename)
return cf
#获取value值
def get_value(self,key):
data = self.cf.get(self.node,key)
return data if __name__ == "__main__":
test = ReadIni()
print(test.get_value("elemant_pwd"))
封装定位元素类 : find_elemnet.py
# -*- coding:utf-8 -*-
from util.ReadIni import ReadIni
from selenium import webdriver class FindElement(object):
def __init__(self, driver):
self.driver = driver def get_element(self, key):
readini = ReadIni()
data = readini.get_value(key)
by = data.split(">")[0]
# print(by)
value = data.split(">")[1]
# print(value)
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_className(value)
else:
return self.driver.find_element_by_xpath(value)
except:
return None if __name__ == "__main__":
driver = webdriver.Chrome()
test = FindElement(driver)
test.get_element("element_email")
页面注册方法封装示例
# -*- coding:utf-8 -*-
from util.find_elemnet import FindElement
from selenium import webdriver class RegisterFunction(object):
def __init__(self,url):
self.driver = self.get_driver(url) #获取driver,并打开网页
def get_driver(self,url):
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
return driver #输入用户信息
def send_user_info(self,key,data):
self.get_user_element(key).send_keys(data) #定位用户的各个element,find_element为find_element.py的实例,然后把实例化的self.driver传入
#然后find_element就可以正常定位
def get_user_element(self,key):
find_element = FindElement(self.driver)
user_element = find_element.get_element(key)
return user_element def main(self):
self.send_user_info("element_email","test@163.com")
self.send_user_info("elemant_name","admin")
self.send_user_info("elemant_pwd", "") if __name__ == "__main__":
url = "http://www.5itest.cn/register"
register = RegisterFunction(url)
register.main()
总结:
页面的常用方法建议本地建立一个方法库表格,后续直接参考,这个是后续要写的
selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装的更多相关文章
- selenium3 web自动化测试框架 三:项目实战中PO模型的设计与封装
po模型设计思想 Page Object 模式主要是将每个页面设计为一个class,其中包含页面中的需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调取页面类来获取页面 ...
- selenium3 web自动化测试框架 五: 数据驱动简介及基础使用
1.数据驱动概述 相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动.简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使 ...
- selenium3 web自动化测试框架 四:Unittest介绍及项目实战中的运用
unittest介绍及运用,可以参考之前写的文章,除了未结合web自动化演示,基础知识都有了 https://www.cnblogs.com/wuzhiming/p/8858305.html unit ...
- selenium3与Python3实战 web自动化测试框架 ☝☝☝
selenium3与Python3实战 web自动化测试框架 selenium3与Python3实战 web自动化测试框架 学习 教程 一.环境搭建 1.selenium环境搭建 Client: py ...
- 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 ...
- Web 自动化测试框架 sweetest 介绍
项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...
- Web自动化测试框架改进
Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...
- Web自动化测试框架-PO模式
Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...
随机推荐
- ubuntu 18.04 enp8s0更改网口名称为eth0
尝试各种方法均不成功,后参考如下方法终于成功: 方法一:单纯改网卡名,重启后显示原网卡名. 如我的网卡名是enp8s0 >> ip link set enp8s0 down //关闭网卡 ...
- TODO:AppiumTestDistribution--CapabilityManager 类
该类代码详见git:https://github.com/AppiumTestDistribution/AppiumTestDistribution/tree/master/src/main/java ...
- Vue-cli中的proxyTable解决开发环境的跨域问题
https://blog.csdn.net/u012149969/article/details/80288126 https://vuejs-templates.github.io/webpack/ ...
- python_网络编程socket(UDP)
服务端: import socket sk = socket.socket(type=socket.SOCK_DGRAM) #创建基于UDP协议的socket对象 sk.bind(('127.0.0. ...
- 如何预测 Pinterest 和 Instagram 的未来发展潜力?
作者:陈琪链接:https://www.zhihu.com/question/20169268/answer/14229241来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- java文件实现文件的上传和下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- 独立看门狗 IWDG
一,独立看门狗 二,独立看门狗的时钟源 独立看门狗拥有自己的时钟源,不依赖PLL时钟输出的分频信号,能够独立运行,这样子的好处就是PLL假如受到干扰, 导致运行异常,独立的看门狗还能正常地进行工作,如 ...
- 启动文件startup_stm32f40_41xxx.s
一.启动文件,startup_stm32f40x_41xx.s 1.定义 启动文件由汇编编写,是系统上电复位后第一执行的程序. Stack_Size EQU 0x00000400 // 栈的大小可以调 ...
- leetcode解题报告(13):K-diff Pairs in an Array
描述 Given an array of integers and an integer k, you need to find the number of unique k-diff pairs i ...
- [CQOI2016]手机号码 数位DP
[CQOI2016]手机号码 用来数位DP入门,数位DP把当前是否需要限制取数范围(是否正在贴着临界值跑,即下面的limited)和一切需要满足的条件全部塞进记忆化搜索参数里面就好了,具体情况转移便好 ...