python自动化之selenium

Posted 素七七吖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python自动化之selenium相关的知识,希望对你有一定的参考价值。


vscode下载selenium,seleniu环境配置https://blog.csdn.net/weixin_34402408/article/details/88724699

八大元素定位

基于标签的属性来定位标签

在这里插入图片描述
在这里插入图片描述

frameset(框架集):忽略;frame(框架)和iframe(子框架)是需要处理的
八大元素定位是指,id、name、link text、partial link text、classname、tagname、cossselector、xpath

id、name

id,基于元素属性里面的id的值来定位,类似于每个人的身份证号,是不重复的
name,基于元素属性里面的name的值来定位,类似每个人的姓名,是可以有重名的

在这里插入图片描述

link text、partial link text

link text,主要用于超链接进行定位

在这里插入图片描述

partial link text是link text的模糊查询版本,类似于数据库中like %,模糊查询匹配到多个符合条件的元素,选取第一个
想找的第二个或者别的元素driver.find_elements_by_partial_link_text("百度")[1](get到百度网址)

在这里插入图片描述

classname、tagname

classname,基于元素样式来进行定位,容易遇到重复的
tagname,标签名进行定位,重复率最高,只有在需要定位后进行二次筛选的时候进行使用

在这里插入图片描述

cossselector、xpath

cossselector定位,应用相对较多,基于class属性来实现的定位,定位的内容可以直接copy选择selector(#id em[class=''])
xpath,是目前应用最多的,基于页面结构来进行定位

在这里插入图片描述

xpath相对路径,基于匹配制度来查找,依照xpath语法结构
例如://*[@id='kw'](//表示从根路径下开始查找;*表示任意元素;[]表示筛选条件/查找函数;@表示基于属性来筛选,例如@id='kw'表示基于属性id的值为kw的条件来查找)

在这里插入图片描述

在浏览器console里面也可以写xpath语句来定位,确认xpath路径是否正确,在F12界面Ctrl+f填入写的语句查找或者在console界面写入语句

在这里插入图片描述

根据文本定位 例如://a[text()="登录"]
当无法直接定位某个元素时,可以通过定位子元素返回父级来获取元素(末尾加上/..来返回上一级)

在这里插入图片描述

除了xpath写法外还有函数写法,//input[contains(@id,'kw')],contains表示匹配模糊查找,id的值包含kw
文本定位,//input[contains(text(),'XXXXX')]
//*[start-with(@id,'XXX')]属性值以XXX开头
//*[substring(@id,2)='XXX'],截取值,从第二个字符开始截取后的值为XXX

在这里插入图片描述

其他特殊定位处理

有框架的定位处理

有框架要先进入框架
driver.switch_to.frame("frame名/id"),然后再进行对框架内的元素的定位
对于没有id和name的框架用xpath定位,传入WebElement对象
iframe=driver.find_element_by_xpath('//*[@id="bjui-navtab"]/div[3]/div/iframe')
driver.switch_to.frame(iframe)

在这里插入图片描述

也可以用WebElement对象来定位
driver.switch_to.frame(driver.find_element_by_tag_name("iframe")) 
出框架:driver.switch_to.default_content()

下拉框的定位

先定位,定位之后转化为下拉框的select对象(要导入包from selenium.webdriver.support.select import select)
通过value值进行定位下拉框里的元素选择

在这里插入图片描述

还可以通过select_by_visible_text(绝对文本内容)来定位选择下拉框里面的元素,例如:sel.select_by_visible_text("50")
绝对文本内容就是所有的文本信息,连空格(&nbsp)也是文本内容,但是有类似空格这种特殊符号,可能该方法就无法定位选中
也可以通过select_by_index(下标)来进行定位选择下拉框内的内容,下拉框元素的每个option都有对应的下标志,第一个是0往下递增

在这里插入图片描述

弹窗处理

弹窗有alert(只有确定),confirm(有确定有取消),prompt(有确定取消还可以输入值)
ale=driver.switch_to.alert
ale.accept()[点击确定,dismiss()是点击取消,send_keys()是输入值,text()是获得弹窗的文本]

在这里插入图片描述

鼠标和键盘操作

在这里插入图片描述

基于网易云的登录自动化实战

网易云手机号登录自动化
最好使用from selenium.webdriver.common.by import By的语法(便于封装)
例如:driver.find_element(By.XPATH,"//a[text()='登录']").click()
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#创建浏览器对象
driver = webdriver.Chrome()
#隐式等待5秒
driver.implicitly_wait(5)
#网易云登录自动化
driver.get("https://music.163.com/")
#最大化当前页面
driver.maximize_window()
#定位元素
#定位登录
driver.find_element(By.XPATH,"//a[text()='登录']").click()
#定位选择其他登录模式
driver.find_element(By.XPATH,"//a[text()='选择其他登录模式']").click()
#定位同意协议勾选框
driver.find_element(By.XPATH,"//input[@id='j-official-terms']").click()
#定位选择手机号登录按钮
driver.find_element(By.XPATH,'//a[@class="u-btn2 u-btn2-2"]').click()
#定位输入账号
driver.find_element(By.XPATH,"//input[@id='p']").send_keys("账号")
#定位输入密码
driver.find_element(By.XPATH,"//input[@id='pw']").send_keys("密码")
#定位登录按钮
driver.find_element(By.XPATH,"//a[@class='j-primary u-btn2 u-btn2-2']").click()
#停留,保持在页面
os.system('pause')
#退出网页
driver.close()

在这里插入图片描述

51job自动搜索python并且把结果输出或者写入表格
先定位输入框输入内容
再定位选择城市,先将已经选择的(class-on)取消选择,再选择自己想要的城市
定位搜索按钮点击
定位结果

在这里插入图片描述

结果写入excel

在这里插入图片描述

unittest框架自动化

vscode中运行unittest框架:
创建python单元测试文件,包含test;文件名必须要包含test,否则将无法识别为unittest框架文件

在这里插入图片描述

按Ctrl+Shift+p,打开vscode命令选板,输入命令“Python:Configure Tests”,然后回车,进入配置

在这里插入图片描述

选择unittest框架和方法命名方式

在这里插入图片描述

打开控制台,可以看到控制台中已经包含了unittest方法

在这里插入图片描述

使用unittest方法
写一个类继承unittest.Testcase
导入unittest包
定义一个以test开头的方法,方法里面写自动化代码(选择的命名方式是以test开头就必须以test开头,其他方法的命名与其对应规则对应)

在这里插入图片描述

命令行的运行方式:python -m unittest python文件名(会运行所有子测试方法,例如:python -m test_autom.py)
只运行其中一个:python -m unittest python文件名.TestCase.类名(例如:python -m test_autom.TestCase.test_login)

设计模式(封装)

pom+关键字封装
pom模式:page object model 页面对象模式
能够解决线性脚本的问题、代码不能重复利用的问题、后期维护的问题
分为三层:
1.基础层(base):放selenium的原生方法;
2.页面对象层(po):主要用于放页面的元素和页面的动作;
3.测试用例层(testcase):存放测试用例以及测试数据
测试用例层调用页面对象层的方法,页面对象层调用基础层的方法

新建一个base层的类将原生方法进行封装
在这里插入图片描述

创建页面对象的类直接继承刚刚的基础类,写入页面元素与页面动作
在这里插入图片描述
测试用例层调用页面层的方法来实现代码
在这里插入图片描述

前后置处理

setUp在测试用例之前的准备工作
tearDown在测试用例之后的扫尾工作(U和D一定要大写,孩子被坑哭了)
新创建一个baseutil类在里面继承unittest.TestCase方法,写入setUp和tearDown,
在测试用例层的login里面就不用继承unittest.TestCase,直接继承baseutil类里面的方法
需要注意的是__init__()方法的改变,以及调用方法时要传递driver参数,page类没有改变

在这里插入图片描述
在这里插入图片描述

生成报告

执行需要的用例并且生成html格式的测试用例报告
在网上下载HTMLTestRunner.py的文件放到python的lib目录下

在这里插入图片描述

断言

self.assertEqual(first, second)用于判断两个值是否相等
self.assertTrue(expr)用于判断一个值是否为True
self.assertIn(member, container)用于判断一个值是否在另一个值里面

在这里插入图片描述

DDT+Excel数据驱动

Excel适用于web自动化,yaml适用于接口自动化
data driver test数据驱动测试,可以完美和unittest结合实现数据驱动
DDT通过装饰器来使用,在函数或者类上面加上一个装饰器来实现特定的功能
@ddt 装饰类,用于声明当前类使用ddt驱动;@data 装饰函数,用于函数传值;@unpack 装饰函数,用于数据解包;@file_data 装饰函数,用于读取yaml、json文件
先写好Excel文件,写入数据后将Excel文件拖入自己所创建的自动化项目的文件夹下

在这里插入图片描述

使用@data传值的时候传递多个值就会执行多次,修改Excel的sheet值为login
写一个excelutil的工具类来实现将Excel里面的数据改为['XX','XX','XX']格式,在用例类里面使用@ddt,@data,@unpack
使用openpyxl,没有该包就先下载,pip3 install openpyxl

在这里插入图片描述

传递空值的时候回报错,因为NoneType的特殊性,加上if语句将None改为""

在这里插入图片描述

pytest

可以结合allure生成定制版的测试报告,支持很多强大的第三方插件(allure-pytest,pytest-xdist,pytest-ordering ……)

默认规则

模块名必须以test_开头或者_test结尾
测试类必须以Test开头,并且不能有init方法
测试方法必须以test开头

修改为pytest形式

在pytest中setup和teardown是小写的u和d,只需要在用例类的函数前加上 @pytest.mark.parametrize()
括号里面写上数据("index,username,password",ExcelUtil().read_excel())数据解析直接"index,username,password",有几个参数就写几个
pytest的断言是直接assert(assert lp.get_except_result()=='welcome')

在这里插入图片描述
在这里插入图片描述

生成报告

先安装pip3 install allure-pytest 

在这里插入图片描述
去官网下载allure2并配置环境https://www.jianshu.com/p/078c2e856a83
配置好了重新打开vscode就可以正常运行了

以上是关于python自动化之selenium的主要内容,如果未能解决你的问题,请参考以下文章

Python实战之Selenium自动化测试web刷新FW

python+selenium之自动生成excle,保存到指定的目录下

Python&Selenium 关键字驱动测试框架之数据文件解析

Selenium2+python自动化55-unittest之装饰器(@classmethod)

Selenium2+python自动化55-unittest之装饰器(@classmethod)转载

Selenium2+python自动化55-unittest之装饰器(@classmethod)转载