文章目录
一、selenium
24年版
安装
(1)安装selenium
在PyCharm中终端下输入命令 pip install selenium
(2)webdriver
1.在最近版本中不需要手动安装,可用直接导入使用。
from selenium import webdriver #从selenium中导入webdriver
#使用Chrom的webdriver,并保存到driver
driver=webdriver.Chrome()
#访问百度
driver.get('https://www.baidu.com')
#等待终端输入,输入之前,不会执行完毕
input()
2.第一次启动会很慢,因为需要下载。
3.浏览器打开后会闪退,因为程序已经执行完毕,会释放所有资源。
4.使用input()可用用来解决浏览器闪退问题。
法二(忽略)
1.一键搭建
pip install webdriver-helper
webdriver-helper:
自动获取浏览器版本、操作系统类型,下载浏览器驱动,创建和返回对象。
2.控制浏览器
with get_webdriver() as driver:
driver.get('https://www.baidu.com')
3.简单示例
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
#创建对象,指明驱动
wd=webdriver.Chrome(service=Service(r'D:\installer\Python\chromedriver.exe'))
#调用对象
wd.get('https://www.baidu.com')
#保持浏览器打开状态
input()
19年版安装(忽略)
1.安装
在cmd中:win+r打开
#安装(pip是一个通用的Python包1管理工具)
pip install selenium
#查看
pip show selenium
#卸载
pip uninstall selenium
#输入错误版本号,可查看可安装版本
pip uninstall selenium==错误版本号
#安装指定版本
pip uninstall selenium==版本号
2.环境配置
#安装谷歌和谷歌驱动:
#安装谷歌驱动:查看谷歌对应版本,安装对应版本驱动
#老版本:https://chromedriver.storage.googleapis.com/index.html
https://googlechromelabs.github.io/chrome-for-testing/
1.查看版本
2.找到对应版本复制链接安装.(我的是131)
3.需要提前安装好python。
将解压的chromedriver.exe放到Python中的Scripts目录下。
配置环境变量。
4.可能出现的问题:
(1)如何找到python位置:where python
(2)将隐藏的文件显示
二、八大定位策略
class By:
"""Set of supported locator strategies."""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
Ctrl + Shift + I打开控制台
1.LINK_TEXT、PARTIAL_LINK_TEXT
只能用于定位a标签
LINK_TEXT:用来进行精确定位
PARTIAL_LINK_TEXT:用来进行模糊定位
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("https://www.youkuaiyun.com/")
el=driver.find_element(By.LINK_TEXT,"登录")
el2=driver.find_element(By.PARTIAL_LINK_TEXT,"登")
print(el)
print(el2)
2.ID、NAME、CLASS_NAME、TAG_NAME
根据属性定位任意元素
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
driver.get("https://www.youkuaiyun.com/")
el=driver.find_element(By.ID,"toolbar-search-input")
#其他同理
"""
<input id="toolbar-search-input" maxlength="2000" autocomplete="off" type="text" value="" placeholder="搜优快云">
"""
print(el)
3.css选择器、xpath
通用定位策略,可用定位到任意元素,上一个分组是通过CSS选择器完成定位的。
# #kw 是在控制台复制粘贴的内容(右键-》复制-》复制selector):CSS选择器
A=driver.find_element(by=By.CSS_SELECTOR,value='#kw')
#//*[@id="su"]是在控制台复制粘贴的内容(右键-》复制-》复制XPath):xpath
B=driver.find_element(by=By.XPATH,value='//*[@id="su"]')
"""
1.XPath语法:表示层级+属性
/:(开头)根路径,eg:/html/body/div
/:(中间)下一级,eg://p/input
//:任意层级(包括下级、下级的下级),eg://div
@:属性,eg://*[@id="su"]
.:本级
..:上一级
2.相对定位
XPath相对定位:父子兄弟
selenium相对定位:上下左右
3.XPath函数
text:获取元素内的文本(精确匹配)
contaions:任意位置包含(模糊匹配)
starts-with:开头包含
"""
函数操作
三、pytest和夹具
解决用例层面的问题。
1.安装
pip install pytest
2.pytest用法
1.代码文件用test开头来命名。
2.在终端输入pytest执行所有用例。
3.在终端输入pytest -k test_XXX来执行test_XXX用例。
3.夹具范围
(1)function: 默认,每个用例执行一次,每个测试函数都会重新初始化和清理夹具。
(2)class: 每个类执行一次。
(3)module: 每个模块执行一次。
(4)package: 每个包只执行一次。
(5)session: 整个测试过程只执行一次。
#通过scope参数传递给@pytest.fixture装饰器来定义夹具的作用范围
#eg:定义一个模块级别的夹具
import pytest
@pytest.fixture(scope="module")
def my_fixture():
# 初始化夹具
yield # 清理夹具
四、百度搜索测试
1.总体操作
(1)测试步骤:
1.启动浏览器
2.访问测试页面
3.对元素A进行输入:北京时间
4.对B元素进行点击:左键单击
5.关闭浏览器
(2)测试断言:
网页中出现多个 北京时间
(3)UI记录:
此时此刻浏览器实际展示效果
2.测试代码
"""
**(1)测试步骤:**
1.启动浏览器
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
"""
2.访问测试页面
"""
driver.get('https://www.baidu.com')
"""
3.对元素A进行输入:北京时间
4.对B元素进行点击:左键单击
"""
#寻找元素find_element
# #kw 是在控制台复制粘贴的内容(右键-》复制-》复制selector):CSS选择器
A=driver.find_element(by=By.CSS_SELECTOR,value='#kw')
#//*[@id="su"]是在控制台复制粘贴的内容(右键-》复制-》复制XPath):xpath
B=driver.find_element(by=By.XPATH,value='//*[@id="su"]')
#send_keys()
#1.输入内容:send_keys("北京时间")
#2.上传文件:send_keys(r"文件")
#3.进行按键:1.刷新:send_keys(Keys.F5)、2.复制:send_keys(Keys.CONTROL+"c")
A.send_keys("北京时间")
#左键单击
B.click()
"""
5.关闭浏览器
"""
driver.quit()
#driver.close():关闭窗口,如果是最后一个窗口,则关闭浏览器
input('暂停执行')
"""
**(2)测试断言:**
网页中出现多个 北京时间
**(3)UI记录:**
此时此刻浏览器实际展示效果
"""
如何复制
查找结果
操作结果
3.断言和UI记录
"""
**(1)测试步骤:**
1.启动浏览器
"""
import time
from os import times
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
"""
2.访问测试页面
"""
driver.get('https://www.baidu.com')
"""
3.对元素A进行输入:北京时间
4.对B元素进行点击:左键单击
"""
#寻找元素find_element
# #kw 是在控制台复制粘贴的内容(右键-》复制-》复制selector):CSS选择器
A=driver.find_element(by=By.CSS_SELECTOR,value='#kw')
#//*[@id="su"]是在控制台复制粘贴的内容(右键-》复制-》复制XPath):xpath
B=driver.find_element(by=By.XPATH,value='//*[@id="su"]')
#send_keys()
#1.输入内容:send_keys("北京时间")
#2.上传文件:send_keys(r"文件")
#3.进行按键:1.刷新:send_keys(Keys.F5)、2.复制:send_keys(Keys.CONTROL+"c")
A.send_keys("北京时间")
#左键单击
B.click()
"""
**(2)测试断言:**
网页中出现多个 北京时间
步骤:
1.获得网页内容(不真实)
2.在网页内容中搜索 北京时间 出现次数
3.判断出现次数大于1(或者大于等于2)
"""
#强制等待10s
time.sleep(10)
"""
**(3)UI记录:**
此时此刻浏览器实际展示效果
"""
#获取截图,保存到文件,文件后缀必须是png
driver.get_screenshot_as_file("page.png")
#获取网页源码
html=driver.page_source
#统计次数
c=html.count("北京时间")
#判断:assert condition(布尔表达式), optional_message(断言失败时显示的错误信息)
assert c>1,f"断言失败:{c=}"
"""
if c>1:
print('断言通过')
else:
print('断言失败')
"""
"""
5.关闭浏览器
"""
driver.quit()
#driver.close():关闭窗口,如果是最后一个窗口,则关闭浏览器
网页内容不真实出现的问题:
UI记录
五、商品下单测试
(下序代码可能有错误,网站连接已经不可用,请自行修改)
1.测试步骤
1.登录
2.选择商品
3.创建订单
4.选择收获地址
5.选择支付方式
6.点击提交订单
2.代码
import time
from os import times
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver=webdriver.Chrome()
#http://101.34.221.219:8010/已经失效,不能打开,请自行更换网站
driver.get("http://101.34.221.219:8010/")
#最大化:防止页面内容不在窗口中,导致交互失败
driver.maximize_window()
#找到页面登录按钮并点击
driver.find_element(By.LINK_TEXT,"登录").click()
#输入账号和密码
driver.find_element(
By.XPATH,'//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH,'//input[@placeholder="请输入登录密码"]',
).send_keys("123123")
#登录
driver.find_element(By.XPATH,'//button[text()="登录"]').click()
#等待系统获取msg
time.sleep(0.5)
#获取登录提示
msg=driver.find_element(By.XPATH,"//p[@class='prompt-masg']").text
#断言
assert msg=="登录成功"
#等待网页跳转到首页
time.sleep(0.5)
driver.get("http://101.34.221.219:8010/")
#找到商品
driver.find_element(By.XPATH,"//a[starts-with(text(),'vivo')]").click()
time.sleep(0.5)
#将窗口切换到最新的窗口
driver.switch_to.window(driver.window_handles[-1])
time.sleep(0.5)
#购买商品
driver.find_element(By.ID,"text_box").send_keys("2")
driver.find_element(By.XPATH,'//button[@title="点击此按钮到下一步确认购买信息"]').click()
#等待页面切换
time.sleep(1)
#处理弹窗,点击弹窗按钮。(可用在控制台源代码中输入debugger找到弹窗信息)
driver.switch_to.alert.accept()
#选择付款方式
driver.find_element(By.XPATH,"//span[text()='货到付款']").click()
time.sleep(1)
driver.switch_to.alert.accept()
#提交订单
driver.find_element(By.XPATH,'//button[@title="点击按钮,提交订单"]').click()
time.sleep(0.5)
msg=driver.find_element(By.XPATH,"//p[@class='prompt-masg']").text
assert msg=="操作成功"
3.pytest初始代码
import time
from os import times
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pytest
#创建夹具
@pytest.fixture()
def driver():
driver = webdriver.Chrome()
driver.get("http://101.34.221.219:8010/")
# 最大化:防止页面内容不在窗口中,导致交互失败
driver.maximize_window()
#前置部分,在测试用例执行之前
yield driver #生成器
#后置部分,在测试用例执行之后
driver.quit()
#使用夹具:在函数中传递一个参数,eg:def test_login_ok(driver)
def test_login_ok(driver):
# driver = webdriver.Chrome()
# driver.get("http://101.34.221.219:8010/")
# 最大化:防止页面内容不在窗口中,导致交互失败
# driver.maximize_window()
# 找到页面登录按钮并点击
driver.find_element(By.LINK_TEXT, "登录").click()
# 输入账号和密码
driver.find_element(
By.XPATH, '//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH, '//input[@placeholder="请输入登录密码"]',
).send_keys("123123")
# 登录
driver.find_element(By.XPATH, '//button[text()="登录"]').click()
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
# 断言
assert msg == "登录成功"
def test_login_fail(driver):
# driver = webdriver.Chrome()
driver.get("http://101.34.221.219:8010/")
# 最大化:防止页面内容不在窗口中,导致交互失败
driver.maximize_window()
# 找到页面登录按钮并点击
driver.find_element(By.LINK_TEXT, "登录").click()
# 输入账号和密码
driver.find_element(
By.XPATH, '//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH, '//input[@placeholder="请输入登录密码"]',
).send_keys("123123123")
# 登录
driver.find_element(By.XPATH, '//button[text()="登录"]').click()
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
# 断言
assert msg == "密码错误"
def test_order_ok(driver):
# driver = webdriver.Chrome()
#直接跳转到商品界面
driver.get("http://101.34.221.219:8010/?s=goods/index/id/6.html")
driver.find_element(By.XPATH, '//button[@title="点击此按钮到下一步确认购买信息"]').click()
# 等待页面切换
time.sleep(1)
# 处理弹窗,点击弹窗按钮
driver.switch_to.alert.accept()
# 选择付款方式
driver.find_element(By.XPATH, "//span[text()='货到付款']").click()
time.sleep(1)
driver.switch_to.alert.accept()
# 提交订单
driver.find_element(By.XPATH, '//button[@title="点击按钮,提交订单"]').click()
time.sleep(0.5)
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
assert msg == "操作成功"
def test_order_fail():
pass
4.优化登录
import time
from os import times
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pytest
#打开网站:未登录
@pytest.fixture(scope="session")
def driver():
driver = webdriver.Chrome()
driver.get("http://101.34.221.219:8010/")
# 最大化:防止页面内容不在窗口中,导致交互失败
driver.maximize_window()
#前置部分,在测试用例执行之前
yield driver #生成器
#后置部分,在测试用例执行之后
driver.quit()
#使用夹具:在函数中传递一个参数,eg:def test_login_ok(driver)
#打开浏览器:已经登录
@pytest.fixture(scope="session")
def user_driver():
driver = webdriver.Chrome()
#登录界面
driver.get("http://101.34.221.219:8010/?s=user/logininfo.html")
# 最大化:防止页面内容不在窗口中,导致交互失败
driver.maximize_window()
#登录
# 输入账号和密码
driver.find_element(
By.XPATH, '//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH, '//input[@placeholder="请输入登录密码"]',
).send_keys("123123")
# 登录
driver.find_element(By.XPATH, '//button[text()="登录"]').click()
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
# 断言
assert msg == "登录成功"
# 前置部分,在测试用例执行之前
yield driver # 生成器
# 后置部分,在测试用例执行之后
driver.quit()
def test_login_ok(driver):
#退出登录状态:清除cookie
driver.delete_all_cookies()
driver.refresh()
# 找到页面登录按钮并点击
driver.find_element(By.LINK_TEXT, "登录").click()
# 输入账号和密码
driver.find_element(
By.XPATH, '//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH, '//input[@placeholder="请输入登录密码"]',
).send_keys("123123")
# 登录
driver.find_element(By.XPATH, '//button[text()="登录"]').click()
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
# 断言
assert msg == "登录成功"
def test_login_fail(driver):
#退出登录状态:清除cookie
driver.delete_all_cookies()
driver.refresh()
# 找到页面登录按钮并点击
driver.find_element(By.LINK_TEXT, "登录").click()
# 输入账号和密码
driver.find_element(
By.XPATH, '//input[@placeholder="请输入用户名/手机/邮箱"]',
).send_keys("beifan")
driver.find_element(
By.XPATH, '//input[@placeholder="请输入登录密码"]',
).send_keys("123123123")
# 登录
driver.find_element(By.XPATH, '//button[text()="登录"]').click()
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
msg = driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
# 断言
assert msg == "密码错误"
def test_order_ok(user_driver):
#直接跳转到商品界面
user_driver.get("http://101.34.221.219:8010/?s=goods/index/id/6.html")
user_driver.find_element(By.XPATH, '//button[@title="点击此按钮到下一步确认购买信息"]').click()
# 等待页面切换
time.sleep(1)
# 处理弹窗,点击弹窗按钮
user_driver.switch_to.alert.accept()
# 选择付款方式
user_driver.find_element(By.XPATH, "//span[text()='货到付款']").click()
time.sleep(1)
user_driver.switch_to.alert.accept()
# 提交订单
user_driver.find_element(By.XPATH, '//button[@title="点击按钮,提交订单"]').click()
time.sleep(0.5)
msg = user_driver.find_element(By.XPATH, "//p[@class='prompt-masg']").text
assert msg == "操作成功"
def test_order_fail():
pass
六、使用POM(Page Object Model)设计模式
解决页面层面的问题。
(1)定义:
1.定义BasePage(抽象类)
2.定义Page(页面类)
3.定义元素的交互(对象方法)
(2)使用:
1.打开页面,实例化Page
2.调用Page方法,完成交互
1.操作描述
1.登录
2.进入个人中心,点击新增地址
3.处理弹窗
4.输入框、下拉选择框
2.代码
pages.py:
from selenium.webdriver.chrome import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.expected_conditions import *
class BasePage:
_loc_msg="//p[@class='prompt-msg']"
def __init__(self,driver:webdriver.Chrome):
self._driver=driver
self._wait=WebDriverWait(driver,10)
#寻找元素
def __getattr__(self, item):
key=f"_loc_"+item
xpath=getattr(self,key,None)
if xpath is not None:
return self.get_element(xpath)
raise AttributeError("元素不存在")
#元素定位
def get_element(self,xpath):
el=self._wait.until(
visibility_of_element_located(
(By.XPATH,xpath,)
)
)
return el
#处理弹窗
def alert_ok(self):
alert=self._wait.until(alert_is_present())
alert.accept()
class LoginPage(BasePage):
_loc_username='//input[@placeholder="请输入用户名/手机/邮箱"]'
_loc_password='//input[@placeholder="请输入登录密码"]'
_loc_btn='//button[text()="登录"]'
def login(self,username,password):
self.username.send_key(username)
self.password.send_key(password)
self.btn.click()
class AddressPage(BasePage):
_loc_new="/html/body/div[4]/div[3]/div/div/button"
_loc_name="/html/body/div[1]/form/div[2]/input"
_loc_tel="/html/body/div[1]/form/div[3]/input"
_loc_sheng="/html/body/div[1]/form/div[4]/div[1]"
_loc_shi="/html/body/div[1]/form/div[4]/div[2]"
_loc_qu="/html/body/div[1]/form/div[4]/div[3]"
_loc_address='//*[@id="from-address"]'
_loc_btn="/html/body/div[1]/form/div[7]/button"
def click_new(self):
self.new.click() #点击按钮
self.alert_ok() #消灭弹窗
iframe=self.get_element("//iframe[starts -with(@src,'http://101.34.221.219:8010')]")
self._driver.switch_to.frame(iframe) #切换窗口
def div_select(self,el,value):
el.click() #点击显示下拉菜单
el.find_element(By.XPATH,'./div/div/input').send_keys(value)
el.find_element(By.XPATH, './div/ul/li').click()
def input_info(
self,
name,
tel,
sheng,
shi,
qu,
address,
):
self.name.send_keys(name)
self.tel.send_keys(tel)
#下拉选择框,特殊处理
self.div_select(self.sheng,sheng)
self.div_select(self.shi, shi)
self.div_select(self.qu, qu)
self.address.send_keys(address)
def click_save(self):
self.btn.click()
test_XXX.py中方法:
def test_login_fail(driver):
#退出登录状态:清除cookie
driver.delete_all_cookies()
driver.refresh()
#1.打开页面,实例化page
driver.get("http://101.34.221.219:8010/?s=user/loginInfo.html")
page=LoginPage(driver)
#2.调用page方法
page.login("XXX","XXXXX")
# 等待系统获取msg
time.sleep(0.5)
# 获取登录提示
assert page.msg.text == "密码错误"
def test_new_address(user_driver):
user_driver.get("页面链接")
page=Address(user_driver)
#点击新增按钮
page.click_new()
#输入
page.input_info()
#保存
page.click_save()
#截图
user_driver.get_screenshot_as_file("a.png")
assert page.msg.text == "操作成功"
注
此为自动化笔记内容学自b站黑马程序员和码尚软件测试平台,感觉有帮助的可用自行去了解更多。