Web自动化笔记(一)


一、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站黑马程序员和码尚软件测试平台,感觉有帮助的可用自行去了解更多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值