web自动化测试

一、selenium 概述

1. 简介

1.1 自动化测试介绍

  • 使用程序(借助软件、或者写代码)替换手工
  • 自动化测试不能完全脱离手工
  • 应用场景
    • 单元测试
    • 回归测试
    • 压力测试
    • 兼容性

1.2 selenium介绍

  • selenium一个web自动化测试工具,控制浏览器
  • 需要借助WebDriver

python代码–> selenium 封装的 python 接口–> WebDriver 提供接口–> 浏览器

selenium工作流程

1.3环境搭建

  • 安装:pip install selenium
  1. 写代码环境

    安装:pip install selenium

  2. 控制浏览器驱动

    1. 确定浏览器版本
    2. 下载匹配操作系统的版本

2. 元素定位:简单方式

环境说明:

  1. pip提示升级,可以不升级
  2. driver不关闭,浏览器不关闭,有可能后台一直启动着
  3. 创建驱动对象,如果不想每次指定驱动文件
    1. 把驱动文件放在PATH任意目录:建议放在Python安装相关的目录
"""
1. 创建驱动对象
2. 打开测试网址
3. 找元素
4. 做后续操作(后面学习)
5. 关闭浏览器

通过 id 属性定位 : find_element_by_id
通过 name 属性定位 : find_element_by_name
通过 class 属性定位 : find_element_by_class_name
通过标签名定位 : find_element_by_tag_name
通过内容定位 a 标签(绝对匹配) : find_element_by_link_text
通过内容定位 a 标签(模糊匹配) : find_element_by_partial_link_text
"""
from selenium.webdriver import Chrome
import time
import traceback

# 1. 创建驱动对象
driver = Chrome()


# file://{本地文件绝对路径}
driver.get('file:///Users/mikejiang/Desktop/code/selenium_code/test.html')

try:
    # 如果找到,返回对象,没有找到,抛出异常NoSuchElementException
    el = driver.find_element_by_id('username11')
    print(el)
    driver.find_element_by_name('password')
    driver.find_element_by_class_name('input-password')
    driver.find_element_by_tag_name('input')
    driver.find_element_by_link_text('标签')
    driver.find_element_by_partial_link_text('Algorithms')

    time.sleep(2)
except Exception as e:
    # 产生异常后执行
    # print(e)
    print(traceback.format_exc()) # 异常过程信息可以打印
finally:
    # 不管有没有异常,都会执行
    driver.quit()

1. 元素定位

1.1 xpath 方式

1.1.1 xpath路径
  • 绝对路径:开头以一个斜杠标志/html/body/form/input

  • 相对路径:开头以2个斜杠标志//body/form/input

  • find_element_by_xpath

1.1.2 xpath定位
    # 如果找到,返回对象,没有找到,抛出异常NoSuchElementException
    # 绝对路径
    driver.find_element_by_xpath('/html/body/form/input')
    # 相对路径
    driver.find_element_by_xpath('//body/form/input')

    # 结合属性
    driver.find_element_by_xpath('//form/input[@type="text"]')
    driver.find_element_by_xpath('//form/input[@type="text" and @name="username"]')

    # 指定元素的上一级路径
    driver.find_element_by_xpath('//form/input/..')

    el = driver.find_element_by_xpath('//ul/li') # 默认是第1个
    print(el)

    el = driver.find_element_by_xpath('//ul/li[1]')  # 第1个
    print(el)

    el = driver.find_element_by_xpath('//ul/li[last()]')  # 最后一个
    print(el)

1.2 CSS 方式

    # 如果找到,返回对象,没有找到,抛出异常NoSuchElementException
    # id="username", id
    driver.find_element_by_css_selector('#username')

    # class="input-password", class
    driver.find_element_by_css_selector('.input-password')

    # 标签元素
    driver.find_element_by_css_selector("form")

    # 属性, 和xpath区别,没有@
    driver.find_element_by_css_selector('input[type="text"]')

    # 父节点为ul下的li
    driver.find_element_by_css_selector("ul>li")

1.3 查询多个元素

  • 方法名:element多一个s
  • 返回值
    • 找到:包含找到元素对象的列表
    • 没有找到:返回空列表

1.4 find_element

# find_element主要用于二次封装使用
# 参数1:为定位元素方式,参数2:定位元素的实现字符串,和以前用法一样
"""
class By(object):
    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"
"""
# driver.find_element_by_id()
# By通过快捷键导包
el = driver.find_element(By.ID, 'username')
print(el)

2. 元素等待

2.1 元素等待介绍

  • 如果页面没有加载完成就定位元素,找不到这个元素

    • 指定等待时间,在指定的时间内,加载完,再定位
  • 方式

    • 强制等待:time.sleep():简单粗暴,指定时间等待,就算网页提前加载完,也必须等待指定的时间
    • 显式等待:
      • 指定时间等待,指定时间没有加载完成,不等了
      • 提前加载完成,也不等了
      • 特点:只能设置等待指定的元素,写法麻烦,效率高
    • 隐式等待
      • 指定时间等待,指定时间没有加载完成,不等了
      • 提前加载完成,也不等了
      • 特点:等待整个页面加载完,写法简单,效率低

2.2 显式等待

    # 1. 创建WebDriverWait对象,指定等待时间
    # 2. WebDriverWait对象.until()设置等待的元素
    # 2.1 传入是一个函数名,这个函数有一个参数,这个参数是Chrome类型
    # 2.2 上一步中的2.1函数体返回定位元素的对象
    # 2.3 WebDriverWait对象.until()返回值就是定位到的对象

    # 参数1:驱动对象,参数2:设置等待时间,
    # 参数3:没有找到,自动调用调用wait_driver.until()指定的函数时间
    # 返回值:对象
    # TimeoutException: 指定时间没有找到,抛出异常
    # 如果元素没有找到,会自动调用wait_driver.until()指定的函数
    wait_driver = WebDriverWait(driver, 10)

    el = wait_driver.until(lambda temp_driver: temp_driver.find_element_by_tag_name('html'))
    print(el)
# WebDriverWait

"""
1. 创建驱动对象
2. 打开测试网址
3. 找元素
4. 做后续操作(后面学习)
5. 关闭浏览器

"""
from selenium.webdriver import Chrome
import time
import traceback

from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait

# 1. 创建驱动对象
driver = Chrome()

# file://{本地文件绝对路径}
driver.get('file:///Users/mikejiang/Desktop/code/selenium_code/test.html')


def find_w_element(by=By.ID, value=None, _t=10):
    wait_driver = WebDriverWait(driver, _t)
    el = wait_driver.until(lambda temp_driver: temp_driver.find_element(by, value))
    return el


def find_w_element_by_xpath(xpath, _t=10):
    wait_driver = WebDriverWait(driver, _t)
    el = wait_driver.until(lambda temp_driver: temp_driver.find_element_by_xpath(xpath))
    return el

try:
    el = find_w_element(By.ID, 'username')
    print(el)

    el = find_w_element_by_xpath('//form/input')
    print(el)


except Exception as e:
    # 产生异常后执行
    # print(e)
    print(traceback.format_exc())  # 异常过程信息可以打印
finally:
    # 不管有没有异常,都会执行
    driver.quit()

2.3 隐式等待

driver.implicitly_wait(10) # 设置等待时间

3. 浏览器常用属性和方法

3.1 属性和方法

    print(driver.title) # 网页名字
    print(driver.current_url) # 当前的url

    # 如果页面元素没有最大化,可能被遮挡,这时候定位元素会失败
    # 每切换一个页面,页面恢复原来的页面
    # driver.maximize_window() # 最大化
    driver.fullscreen_window() # 全屏

3.2 窗口截图

    # 1. 截图操作应该放在except那里
    # 2. 页面出错后,截图页面,方便后面定位错误
    # 3. 截图,是截运行的浏览器页面
    driver.get_screenshot_as_file('xxx.png')

3.3 执行 javascript 代码

    # 弹出对话框
    # driver.execute_script(js代码)
    driver.execute_script('alert("mike帅吗")')

3.4 cookie

    """
    driver.get_cookies() # 获取所有的 cookie
    driver.get_cookie(name) # 获取指定的 cookie
    driver.delete_cookie(name) # 删除指定的 cookie
    driver.delete_all_cookies() # 删除所有的 cookie
    driver.add_cookie(cookie_dict) # 添加一个 cookie cookie_dict {"name":"xxx","value":"xxx"} 可选的 key 是 "path", "domain", "secure", "expiry"
    """
    # print(driver.get_cookies())
    for v in driver.get_cookies():
        print(f'{v["name"]} =====> {v["value"]}')

    print('='*80)
    cookie_dict = {
        'name': 'k1',
        'value': 'v1'
    }
    driver.add_cookie(cookie_dict) # 添加

    for v in driver.get_cookies():
        print(f'{v["name"]} =====> {v["value"]}')

    print('=' * 80)

    driver.delete_cookie('k1') # 删除name为k1的cookies

    for v in driver.get_cookies():
        print(f'{v["name"]} =====> {v["value"]}')

    print('=' * 80)

4. 元素常用属性和方法

4.1 模拟鼠标单击

    # 1. 先找button元素对象
    el = driver.find_element_by_id('button')

    # 点击10次
    for _ in range(10):
        el.click()
        time.sleep(0.5)

4.2 输入框元素填充数据和清空

    # 1. 先找button元素对象
    el = driver.find_element_by_id('username')
    time.sleep(1)
    el.send_keys('mike帅吗?') # 输入
    time.sleep(2)
    el.clear() # 清空
    time.sleep(1)
    el.send_keys('不帅!!!')
    time.sleep(1)

4.3 获取标签的属性

元素对象.text:  获取元素对象上的文本内容,标签上有内容才有效
元素对象.get_attribute('innerHTML') 获取标签上的内置的html代码
get_attribute还可以获取其它属性

4.4 行为链

from selenium.webdriver import Chrome
import traceback
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time

# 通过指定chromedriver的路径来实例化driver对象
driver = Chrome(executable_path='./chromedriver')

# 控制浏览器访问url地址
# file://{本地文件绝对路径}
driver.get('file:///Users/mikejiang/Desktop/code/selenium_code/test.html')  # 打开本地 html 文件

# 实例化 ActionChains 对象
actions = ActionChains(driver)

try:

    # 找到输入框元素
    input_el = driver.find_element_by_id('username')

    # 鼠标移动到表单元素上-->执行点击-->按下shift-->按下 a -->松开 shift-->松开 a
    # 相当于给输入框驶入一个字母 A
    actions.move_to_element(input_el).click().key_down(Keys.SHIFT).key_down('a').key_up(Keys.SHIFT).key_up('a')
    # 执行行为链
    actions.perform()
    time.sleep(2)

except Exception:
    print(traceback.format_exc())
finally:
    # 退出浏览器
    driver.quit()

5. 窗口、frame、警告框

5.1 frame 切换

frame

# file://{本地文件绝对路径}
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=html_elements_select')

try:
    # 1. 找iframe元素,在外页面找
    el_frame = driver.find_element_by_css_selector("iframe")

    # 2. 切换到frame里面
    # driver.switch_to.frame(frame元素)
    driver.switch_to.frame(el_frame)

    # 3. 在里面找所需的元素
    el = driver.find_element_by_css_selector('select')
    print(el.get_attribute('innerHTML'))

5.2 多窗口切换

    # 0. 获取当前窗口的句柄
    print(driver.current_window_handle) # 首页

    # 1. 打开百度首页的新闻,点击
    driver.find_element_by_link_text('新闻').click()

    # 1.1 获取当前窗口的句柄
    print(driver.current_window_handle) # 首页, 不会因为点击后切换到新的窗口

    # 2. 获取窗口所有的句柄(新开一个页面,有2个句柄)
    print(driver.window_handles)

    # 3. 切换
    time.sleep(1)
    driver.switch_to.window(driver.window_handles[1]) # 切换到新闻的页面
    time.sleep(1)
    driver.switch_to.window(driver.window_handles[0]) # 百度首页
    time.sleep(1)
    driver.switch_to.window(driver.window_handles[1]) # 新闻页面

5.3 警告框处理

    # 1. 弹出一个警告框
    driver.execute_script('alert("hello mike")')
    time.sleep(2)

    # 2. 切换到警告框
    alert = driver.switch_to.alert
    time.sleep(1)
    # 3. 关闭警告框
    alert.dismiss() # 关闭
    alert.accept() # 接收

    time.sleep(2)

6. 下拉选择框

下拉选择框

    # 1. 找下拉框
    # el = driver.find_element_by_id('select-single')
    el = driver.find_element_by_id('select-multiple')
    # 2. 创建专属类型的对象
    sel_obj = Select(el)
    # 3. 操作
    # print(sel_obj.options) # 查看下拉框内容
    print(len(sel_obj.options)) # 查看下拉框个数
    time.sleep(1)

    for i in range(len(sel_obj.options)):
        sel_obj.select_by_index(i)
        time.sleep(1)

7. 无界面模式

# 1. 创建配置对象
opt = ChromeOptions()
# 2. 添加选项
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')


# 3. 创建驱动对象, 指定配置选项信息
driver = Chrome(options=opt)

8. 综合案例

8.1 目录结构

目录结构

  • 如果在windows下,写代码,需要重新安装一下框架:unittest, 参数化,测试报告
  • 把selenium测试的过程写在测试用例中

8.2 main.py实现

8.3 测试用例

8.3.1 前置后置方法
8.3.2 登陆登出测试用例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值