学习目的:

掌握自动化框架中需要的一些基础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自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装的更多相关文章

  1. selenium3 web自动化测试框架 三:项目实战中PO模型的设计与封装

    po模型设计思想 Page Object 模式主要是将每个页面设计为一个class,其中包含页面中的需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调取页面类来获取页面 ...

  2. selenium3 web自动化测试框架 五: 数据驱动简介及基础使用

    1.数据驱动概述 相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动.简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使 ...

  3. selenium3 web自动化测试框架 四:Unittest介绍及项目实战中的运用

    unittest介绍及运用,可以参考之前写的文章,除了未结合web自动化演示,基础知识都有了 https://www.cnblogs.com/wuzhiming/p/8858305.html unit ...

  4. selenium3与Python3实战 web自动化测试框架 ☝☝☝

    selenium3与Python3实战 web自动化测试框架 selenium3与Python3实战 web自动化测试框架 学习 教程 一.环境搭建 1.selenium环境搭建 Client: py ...

  5. selenium3与Python3实战 web自动化测试框架✍✍✍

    selenium3与Python3实战 web自动化测试框架  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  6. web自动化 基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架

    基于python+Selenium+PHP+Ftp实现的轻量级web自动化测试框架   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  7. Web 自动化测试框架 sweetest 介绍

    项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...

  8. Web自动化测试框架改进

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...

  9. Web自动化测试框架-PO模式

    Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...

随机推荐

  1. 一步一步pwn路由器之rop技术实战

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这次程序也是 DVRF 里面的,他的路径是 pwnable/She ...

  2. JavaScript查漏补缺

    js函数定义的三种方式: 函数声明 function sum(a,b){ return a+b } 函数表达式 var sum = function(a,b){ return a+b } Functi ...

  3. JAVA遇见HTML——Servlet篇:应用MVC架构实现项目

    java关键字“this”只能用在方法方法体内.当一个对象创建之后,java虚拟机就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.只能在非静态方法中使用 package servle ...

  4. Java集合--TreeMap

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 TreeM ...

  5. c++ string类基本使用

    初始化用法 #include <iostream> #include "string" using namespace std; void main() { strin ...

  6. swoole组件----mysql查询,插入数据

    注意!任何swoole函数都应该包含在go(function(){}) 经典查询方法query() go(function (){ $swoole_mysql = new Swoole\Corouti ...

  7. 推荐一款在IntelliJ IDEA中使用微信/QQ的插件

    SmartIM SmartIM4IntelliJ 是一个 IntelliJ IDEA 上的 SmartIM(原 SmartQQ)插件,可以在 IDEA 中使用 QQ 或微信聊天. 功能 收发文本消息 ...

  8. Luogu P4082 [USACO17DEC]Push a Box 点双连通分量/圆方树

    (貌似有圆方树的做法,我写的是点双) 显然这道题就是直接搜索.定义状态为f[i][j][0~4]表示箱子在(i,j),人在某个方向推.然后问题就是怎么转向.我们发现如果要转向,必须是人走过一条不包括( ...

  9. 012_Linux驱动之_wait_event_interruptible

    1. 首先这篇博客讲解得挺好的,推荐 wait_event_interruptible 使用方法 2 .函数原型: #define wait_event_interruptible(wq, condi ...

  10. ansible-cmdb 解析(ansible all -m setup )收集过来的信息并以html方式显示。

    首先安装 ansible-cmdb 直接pip install ansible-cmdb 安装 然后执行收集信息命令 ansible all -m setup >/tmp/out/ 修改下ans ...