element 登录_Python selenium自动化测试框架入门实战--登录测试案例

811aa59ede9c893b2eef9df237669100.png

本文为Python自动化测试框架基础入门篇,主要帮助会写基本selenium测试代码又没有规划的同仁。

本文应用到POM模型、selenium、unittest框架、configparser配置文件、smtplib邮件发送、HTMLTestRunner测试报告模块结合登录案例实现简单自动化测试框架

项目主要包括以下几个部分

f671568794ba16a4bcf5731dfa023ee3.png

conif.ini 放置配置文件

例如:

91477578492ef088422645a3312de350.png

myunit.py文件放置的浏览器操作代码


import unittest

from selenium import webdriver

class MyTest(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Chrome()

self.driver.implicitly_wait(10)

self.driver.maximize_window()

def tearDown(self):

self.driver.quit()

if __name__=='__main__':

unittest.main()


base.py中放置浏览器对象操作代码


from selenium.webdriver.supportimport expected_conditionsas EC

from selenium.webdriver.support.waitimport WebDriverWait

import os,configparser

class Page(object):

path = os.path.dirname(os.path.abspath("."))

cfpath = os.path.join(path,'autoparkerconfigconf.ini')

conf = configparser.ConfigParser()

conf.read(cfpath)

url=conf.get('base','url')

def __init__(self,driver,url=url):

self.driver=driver

self.url=url

def open(self):

self.driver.get(self.url)

def find_element(self,*loc):#传入参数为元组需要加*,本身就是元组的不需要*

#print(*loc)

try:

WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))

return self.driver.find_element(*loc)

except:

print('页面中未找到 %s 元素'%(self,loc))

def find_elements(self,*loc):

return self.driver.find_elements(*loc)

def send_keys(self,loc,value):

self.find_element(*loc).send_keys(value)

def click(self,loc):

self.find_element(*loc).click()

def clear(self,loc):

self.find_element(*loc).clear()


loginpage.py中放置通用登录模块代码(尽量避免重复代码)


from selenium.webdriver.common.byimport By

from timeimport sleep

from objpage.baseimport Page

class login(Page):

username_loc=(By.NAME,'accounts')

password_loc=(By.NAME,'pwd')

login_button_loc=(By.XPATH,'/html/body/div[5]/div/form/fieldset/p/button')

login_error_loc=(By.XPATH,'//*[@id="common-prompt"]/p')

def login_username(self,username):

self.find_element(*self.username_loc).clear()

self.find_element(*self.username_loc).send_keys(username)

def login_password(self,password):

self.find_element(*self.password_loc).clear()

self.find_element(*self.password_loc).send_keys(password)

def login_button(self):

self.find_element(*self.login_button_loc).click()

#统一登录入口

def user_login(self,username,password):

self.open()

self.login_username(username)

self.login_password(password)

self.login_button()

sleep(2)

#登录提示信息

def login_error_text(self):

return self.find_element(*self.login_error_loc).text


parker.py中放置公共元素操作代码(parker是我随便命名的,不纠结)


from seleniumimport webdriver

from selenium.webdriver.common.action_chainsimport ActionChains

from selenium.webdriver.support.selectimport Select

class Parker(object):

def __init__(self,browser='chrome'):

if browser=='ie' or browser=='internet explorer':

driver=webdriver.Ie()

elif browser=='firefox' or browser=='ff':

driver=webdriver.Firefox()

elif browser=='chrome':

driver=webdriver.Chrome()

try:

self.driver=driver

except Exception:

raise NameError('没有找到浏览器,请输入"ie","chrome","ff"')

def wait(self,secs=5):#隐式等待

self.driver.implicitly_wait(secs)

def to_element(self,key):#元素定位

if '->' not in key:#如果key里面不包含=就执行下列语句

raise NameError('参数类型输入错误')

by=key.split('->')[0]#通过分隔获取[0]对应的值

val=key.split('->')[1]#通过分隔获取[1]对应的值

if by=='id':

element=self.driver.find_element_by_id(val)

elif by=='name':

element=self.driver.find_element_by_name(val)

elif by=='class':

element=self.driver.find_element_by_class_name(val)

elif by=='link_text':

element=self.driver.find_element_by_link_text(val)

elif by=='xpath':

element=self.driver.find_element_by_xpath(val)

elif by=='css':

element=self.driver.find_element_by_css_selector(val)

else:

raise NameError('请输入正确的定位方式:id,name,class,link_text,xpath,css')

return element

def open(self,url):#打开一个URL

self.driver.get(url)

def max_window(self):#最大化窗口(浏览器)

self.driver.maximize_window()

def set_windows(self,wide,high):#设置窗口大小

self.driver.set_window_size(wide,high)

def input(self,key,text):#对文本框进行输入

el=self.to_element(key)

el.send_keys(text)

def click(self,key):#点击

el=self.to_element(key)

el.click()

def clear(self,key):#清除文本框内容

el=self.to_element(key)

el.clear()

def right_click(self,key):#右键操作

el=self.to_element(key)

ActionChains(self.driver).context_click(el).perform()

def move_to_element(self,key):#鼠标悬停

el=self.to_element(key)

ActionChains(self.driver).move_to_element(el).perform()

def drag_and_drop(self,el_key,ta_key):#拖拽 从一个元素拖到另外一个元素

el=self.to_element(el_key)

target=self.to_element(ta_key)

ActionChains(self.driver).drag_and_drop(el,target).perform()

def click_text(self,text):

self.driver.find_element_by_partial_link_text(text).click()

def close(self):#关闭当前浏览器窗口

self.driver.close()

def quit(self):#退出浏览器

self.driver.quit()

def submit(self,key):#提交事件

el=self.to_element(key)

el.submit()

def F5(self):#刷新

self.driver.refresh()

def js(self,script):#执行js

self.driver.execute_script(script)

def get_attribute(self,key,attribute):#获取元素属性

el=self.to_element(key)

return el.get_attribute(attribute)

def get_text(self,key):#获取text

el=self.to_element(key)

return el.text

def get_title(self):#获取title

return self.driver.title

def get_url(self):#获取url

return self.driver.current_url

def to_frame(self,key):#窗口切换

el=self.to_element(key)

self.driver.switch_to.frame(el)

def alert_accept(self):#对话框确认操作

self.driver.switch_to.alert.accept()

def alert_dismiss(self):#对话框取消操作

self.driver.switch_to.alert.dismiss()

def img(self,fp):#截图

self.driver.get_screenshot_as_file(fp)

def select_by_value(self,key,value):#下拉框操作

el=self.to_element(key)

Select(el).select_by_value(value)


send_email.py放置邮件发送代码


import smtplib

from email.mime.textimport MIMEText

from email.mime.multipartimport MIMEMultipart

import configparser

import os

def sendEmail(file_path):

path=os.path.dirname(os.path.abspath("."))

cfpath=os.path.join(path,'autoparkerconfigconf.ini')

conf = configparser.ConfigParser()

conf.read(cfpath)

smtpserver = conf.get('emailqq','smtpserver')

sender = conf.get('emailqq','sender')

pwd = conf.get('emailqq','pwd')

receiver=[]

email_to=conf.get('emailqq','receiver')

email_array=email_to.split(';')

for iin range(len(email_array)):

receiver.append(email_array[i])

print(receiver)

with open(file_path,'rb')as fp:

mail_boby=fp.read()

msg=MIMEMultipart()

msg['From']=sender

msg['To']=",".join(receiver)

msg['Subject']='我曾把完整的镜子打碎'

body=MIMEText(mail_boby,'html','utf-8')

msg.attach(body)

att=MIMEText(mail_boby,'html','utf-8')

att['Content-Type']='application/octet-stream'

att['Content-Disposition']='attachment;filename="test_reuslt.html"'

msg.attach(att)

try:

smtp=smtplib.SMTP()

smtp.connect(smtpserver)

smtp.login(sender,pwd)

except:

smtp=smtplib.SMTP_SSL(smtpserver,465)

smtp.login(sender,pwd)

smtp.sendmail(sender,receiver,msg.as_string())

smtp.quit()

sendEmail('D:report.html')


最后main.py文件放置的就是运行代码(执行这个文件进行测试就可以)



import HTMLTestRunner

import unittest

from test_case.loginimport loginTest

from public.send_emailimport sendEmail

if __name__=='__main__':

testunit=unittest.TestLoader().loadTestsFromTestCase(loginTest)

suite=unittest.TestSuite(testunit)

file_path="D:html_report.html"

fp=open(file_path,'wb')

runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='登录测试',description='测试执行结果')

runner.run(suite)

fp.close()

sendEmail(file_path)


今天就先到这里,一个入门级的自动化测试框架,由于是非专业开发自学,拿出来给大家分享,编程代码可能有点不规范,命名也很随意。大家先将就着看吧!回头慢慢完善。

还要多向大佬们学习。

备注:有想一起自学的朋友可以看配置文件代码,一起交流。三人行必有我师焉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后处理安装_Mastercam2017(自定义后处理选项)安装!

我们用Mastercam2017编程的程序,需要用在不同的机床加工零件时,这时候我们也要选择适合不同机床认识的自动后处理文件来生成程序,当然系统默认是不能实现这一功能的,那么安装了自定义后处理选项插件,就能完全实现自定义…

为什么redis取出来是null_[2020] Redis 最新面试题

Redis 的数据类型(数据结构)string (二进制安全,可以存储任意类型的数据)list(链表)字典(就是hashmap)set(不重复无序的hashmap)zset(…

的优先级大小_如何评估需求的优先级?

一、 需求的优先级怎么定义? 很多产品经理,包括我,一定都会遇到这样的场景:“ 需求堆如山,什么都想做 ”。面对各种各样、来自各个渠道的需求,产品经理的工作职责之一,就是梳理需求的优先级。我…

html自动给图片加上水印 代码_如何给一千张图片去水印?还好我会python,100行代码轻松搞定...

写在前面近期好多网友私信我,问我编程该怎么学习、怎么入门。我觉得编程学习,就像写文章一样,需要积累。如果把代码每个字符拆开,大伙都认识,但是组合在一起,就是另外一回事了。所以我的建议是,…

html中两个图片叠放,CSS实现图片叠放(勾选图标)

场景我们经常会遇到这种场景,有一个待选图片列表,在图片上(可能是右上角也有可能时右下角)叠放一个勾选状态图标,这篇文章就记录实现这个功能的过程。原理利用flex布局space-around显示图片列表在图片的外层加一个div,同时把勾选状…

pyspark sparksession_PySpark 处理数据和数据建模

安装相关包from pyspark.sql import SparkSession from pyspark.sql.functions import udf, when, count, countDistinct from pyspark.sql.types import IntegerType,StringType from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler from…

linq查询不包含某个值的记录_MySQL行(记录)的详细操作

阅读目录一 介绍二 插入数据INSERT三 更新数据UPDATE四 删除数据DELETE五 查询数据SELECT六 权限管理一 介绍MySQL数据操作: DML在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插入UPDATE实现数据的…

听课评课记录计算机应用,教师听课的评语(精选10篇)

教师听课的评语(精选10篇)通过引导学生提炼信息提出问题解决问题,使学生再次感受了数学与现实生活的密切联系,经历了运用乘法口诀求商的计算方法的形成过程,培养了学生对知识的迁移能力。下面是小编整理的教师听课的评语(精选10篇)&#xff0…

java音频实时传输_会议室智能系统建设方案,实时远程视频协作

2019年,预计会议协作需求将持续增长,创建多功能会议室促进本地、异地协作仍然是一个强大的趋势。无论空间大小或距离远近,政府部门、企业单位以及团体组织为了实现决策指令畅通、管理层次分明,需要通过对会议室环境、多功能会议系…

依赖 netty spring_十分钟带你了解Spring的七大知识点,程序员必了解

Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。很多研发人员把spring看作心目中最好的java项目,没有之一。所以这是重点也是难点&…

android实现手机拍照以及图片预览功能_手机系统将有A/B分区?Android 11这些变化你关注过吗...

跳票让Android 11沉淀下来并吸引了更多的消费者,在iPhone SE大规模进军主流消费市场的今天,Android这边难道不想依靠新系统扳回一局吗?在人们感叹iOS一些功能似曾相似的时候,Android 11新的突破与创新格外让人振奋。01Android 11欲…

小程序的点赞功能能和浏览次数功能_扫码点餐小程序好用吗?小程序还能实现哪些功能?...

有不少的餐厅现在都可以用小程序扫码点餐了,为什么现在很少用公众号点餐了?原因其实很简单,用公众号点餐用户还要关注公众号,第二个就是在于公众号每天发消息很烦,而小程序则没有这样的烦恼,只在使用的时候…

word计算机课教学反思,《WORD》初中信息技术的教学反思

《WORD》初中信息技术的教学反思本节课在建构主义学习理论指导下,采用“任务驱动”教学策略,借助多媒体课件,对学生实施研究式自主学习教学模式,教学中注重培养学生分析问题、解决问题的能力。通过学习和实际操作,培养…

simulink中mask设置_(实现BPSK学习Verilog)1. Simulink仿真实现

欢迎关注BUG记录知乎专栏和BUG记录公众号,关注BUG记录公众号回复101获取本文使用的Simulink仿真文件微信号:BugRec由于最近研究某个高速接口没什么实质性的突破,实在写不出太好的东西,所以就写点更为基础的东西分享给大家&#xf…

arima模型_[不说人话系列]-ARIMA模型

看文献的时候看到几个统计推理的模型,想要大概了解,想做个系列,记录自己胡说八道的数理笔记过程。如有错误,感谢您指正。文前感谢冯小姐详细认真的技术援助!1- 名称简称:ARIMA模型英文名:Auto r…

pcb天线和纯铜天线_如何简化天线设计?相控阵波束成形IC来助您

为提高性能,无线通信和雷达系统对天线架构的需求不断增长。只有那些功耗低于传统机械操纵碟形天线的天线才能实现许多新的应用。除了这些要求以外,还需要针对新的威胁或新的用户快速重新定位,传输多个数据流,并以超低的成本……正…

c语言贪吃蛇_C语言贪吃蛇完整代码

#include #include #include //windows编程头文件#include #include //控制台输入输出头文件#ifndef __cplusplustypedef char bool;#define false 0#define true 1#endif//将光标移动到控制台的(x,y)坐标点处void gotoxy(int x, int y){COORD coord;coord.X x;coord.Y y;Se…

上海市计算机一级客观题,2012年上海市高校计算机等级考试(一级)模拟卷客观题...

2012年上海市高校计算机等级考试(一级)模拟卷客观题 (5页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!11.9 积分关于防火墙,以下说法不正确的是____A____。下列属于视频制作的常用软件的…

百度云盘云知梦php_教你搭建私有云盘,简单快速,完全傻瓜式!不限速,永久有效!...

免费的云盘服务有很多,但是总感觉把重要文件存在上面不安全,动不动就跑路或者限速。辛辛苦苦收集的学习资料,一夜直接可能就会付诸东流。最稳妥的方式是存放在本地硬盘中,但是要进行共享或者不同设备之间进行交换,就显…

结束 txt进程_Python多进程抓取拉钩网十万数据

转载:Python多进程抓取拉钩网十万数据准备安装Mongodb数据库其实不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。这篇文章我们的例子是Mongodb,所以大家需要下载它。在Windows中。由于MongoDB默认的数据目录…