UI自动化测试(一)

本文介绍了如何使用Selenium进行Web自动化测试,包括安装Selenium库和浏览器驱动,讲解了八大元素定位方式,如id、name、xpath等,并展示了webdriver的常用方法,如浏览器操作、元素操作、设置等待时间、鼠标和键盘事件,还涵盖了多窗口切换、表单切换、弹框处理、下拉框操作和文件上传。此外,文中还提到了断言在验证测试结果中的重要性。
摘要由CSDN通过智能技术生成

一、安装

1. selenium其实虽然称之为工具,但是实际是python中一个库

pip install selenium==3.14

2.安装浏览器

谷歌、火狐、edge

3.下载浏览器驱动

根据浏览器版本下载
详情看下文链接:
https://blog.csdn.net/qq_37515374/article/details/128651883

二、八大元素定位方式

1、id定位

如果某个元素的有id属性,那么如果id属性的值唯一,则可以利用该属性的值定位
如果id属性的值是一串无序的字母或者数字,则不能使用,有可能是动态id

driver.find_element_by_id("id属性的值")

2、name定位

根据name属性的值来定位,但是如果name属性的值在当前页面不唯一,则是无法定位的

driver.find_element_by_name("keyWord")

3、class name

class属性的值,不唯一的可能性很大

driver.find_element_by_class_name('s_ipt')

4、tag name (通过标签名本身选择,一般无法使用,不推荐)

driver.find_element_by_tag_name("标签名")

5、link text (一般不要使用)

driver.find_element_by_link_text("搜索")

6、partial link text(一般不要使用)

driver.find_element_by_partial_link_text("搜")

7、xpath

  • //标签名[@属性名=‘属性值’],其中// 表示全局搜索;标签名 表示要查找的元素的标签名;@属性名 表示该元素的某个属性名;‘属性值’ 表示该属性的值。
  • /父元素/子元素,用 / 来表示层级关系,可以选取某个父元素下的直接子元素。
  • //*[@属性名=‘属性值’],用 * 表示匹配所有的元素,并加上 [@属性名=‘属性值’] 来选择符合条件的元素。
  • //*[contains(text(),‘文本内容’)],用 contains() 函数来匹配元素时,文本内容必须保持一致。
  • 使用逻辑运算符、通配符、使用轴
driver.find_element_by_xpath("//div[@class='source']//*[text()='删除']").click()

8、css selector

根据标签以及标签的属性进行定位

driver.find_element_by_css_selector('input[name="keyWord"]')
# 如果class属性的值唯一,也可以将其写成css的语法.s_iptdriver.find_element_by_css_selector('.s_ipt')

三、webdriver常用方法

1、浏览器的操作

from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 设置宽和高
driver.set_window_size(480, 800)
# 后退
driver.back()
time.sleep(3)
# 前进
driver.forward()
# 刷新当前页面
driver.refresh()
# 关闭当前窗口
driver.close()
time.sleep(2)
# 关闭浏览器
driver.quit()

2、元素操作

from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜素框
search_element= driver.find_element_by_id('kw')
# 输入内容
search_element.send_keys("乔丹")
# 直接使用submit进行提交
search_element.submit()

# 其他操作
# 清空输入的值
clear()
# 元素尺寸
size
# 元素文本
text
# 获取元素的属性值
get_attribute('属性值') --idclass

3、设置等待时间

  • 设置隐式等待
driver.implicitly_wait(10)
  • 显式等待,一般适用于单个元素加载较慢、或者需要等待特定状态的情况。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建浏览器对象
driver = webdriver.Chrome()

# 访问网址并进行后续操作
driver.get('https://www.baidu.com')
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'kw'))
)
element.send_keys('搜索关键字')

4、鼠标事件

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。ActionChains 类提供了鼠标操作的常用方法:

  • perform(): 执行所有 ActionChains 中存储的行为;
  • context_click(): 右击;
  • double_click(): 双击;
  • drag_and_drop(): 拖动;
  • move_to_element(): 鼠标悬停。
from selenium import webdriver
# 导入ActionChains这个类
from selenium.webdriver.common.action_chains import ActionChains
import time
# 打开浏览器
driver = webdriver.Chrome()
# 设置浏览器最大化
driver.maximize_window()
# 设置隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
time.sleep(2)
# 定位到设置
st_button = driver.find_element_by_id('s-usersetting-top')
# 设置鼠标悬停
# perform()执行前面的操作
# ActionChains(打开的浏览器对象,driver).move_to_element(悬停的元素).perform()
ActionChains(driver).move_to_element(st_button).perform()

5、键盘事件

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
  • send_keys(Keys.SPACE) 空格键(Space)
  • send_keys(Keys.TAB) 制表键(Tab)
  • send_keys(Keys.ESCAPE) 回退键(Esc)
  • send_keys(Keys.ENTER) 回车键(Enter)
  • send_keys(Keys.CONTROL,’a’) 全选(Ctrl+A)
  • send_keys(Keys.CONTROL,’c’) 复制(Ctrl+C)
  • send_keys(Keys.CONTROL,’x’) 剪切(Ctrl+X)
  • send_keys(Keys.CONTROL,’v’) 粘贴(Ctrl+V)
  • send_keys(Keys.F1) 键盘 F1
  • ……
  • send_keys(Keys.F12) 键盘 F12
from selenium import webdriver
# Keys类才能调用键盘
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位输入框
serach_box = driver.find_element_by_id('kw')
# 输入内容
serach_box.send_keys("seleniummABC")
time.sleep(3)
# 删除多余的m   调用的删除键
# Keys.BACK_SPACE只能删除一个字母,要删除多个字母,则需要乘积
serach_box.send_keys(4*Keys.BACK_SPACE)

6、多窗口切换

浏览器打开的窗口其实会有一个叫句柄的概念。句柄就类似于每一个标签页的id一样,是唯一的

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 搜索
obj = driver.find_element_by_id('kw')
obj.send_keys("马蓉")
# 回车
obj.send_keys(Keys.ENTER)
# 点击 马蓉百度百科
driver.find_element_by_xpath('//div[@id="content_left"]/div[1]//h3/a').click()
# 强制等待
time.sleep(3)
# 获取当前浏览器的所有窗口的句柄,获取回来的窗口句柄放在了一个列表中
headles = driver.window_handles
print(headles)
# 根据下标进行句柄切换,获取回来的时候,窗口的句柄是一个列表,列表下标为-1的元素则是最新打开的窗口句柄,下标为0的是第一个
driver.switch_to.window(headles[-1])
# 点击 编辑 按钮
driver.find_element_by_xpath('//dd[@data-pid="0"]/a[2]').click()

7、表单切换

from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("https://mail.163.com/")
# iframe表单切换
'''
switch_to.frame() 中默认可以写 该iframe标签的id和name属性的值,但是id和name要唯一
还可以通过其他的定位方式,定位到该iframe标签,然后将定位到iframe标签对象传入给switch_to.frame()
'''
# 通过xpath的方式定位iframe标签
iframe_element = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe')
# 切换
driver.switch_to.frame(iframe_element)
time.sleep(3)
# 定位邮箱输入框            
driver.find_element_by_css_selector('input[name="email"]').send_keys("aaa")
# 密码
driver.find_element_by_css_selector('input[name="password"]').send_keys("aaa")
# 选择框勾选
driver.find_element_by_id("un-login").click()
# 点击 登录 按钮
driver.find_element_by_id('dologin').click()
time.sleep(2)
# 由于上面登录的时候邮箱和密码,是在内存子页面中,所以通过iframe已经切换进去了,而 vip 又在最外层页面,所以要切换到最外层
driver.switch_to.default_content()
# 点击 vip
driver.find_element_by_css_selector('a[href="https://vipmail.163.com/?from=fmail"]').click()

8、弹框处理

  • 点击确定:driver.switch_to.alert.accept()
  • 点击取消:driver.switch_to.alert.dismiss()
  • 弹框中输入文本:driver.switch_to.alert.send_keys()
  • 获取弹框中的文本内容:driver.switch_to.alert.text

9、下拉框处理

from selenium import webdriver
from selenium.webdriver.support.ui import Select

# 打开浏览器
driver = webdriver.Chrome()
# 浏览器最大化
driver.maximize_window()
# 隐式等待
driver.implicitly_wait(10)
# 打开网页
driver.get("file:///D:/Pycharm/study/UI自动化/new_file.html")
# 先进行类的实例化,传入下拉选择框的对象
select_obj = driver.find_element_by_name('myselect')
s1 = Select(select_obj)
# 选择具体的选项:有三种方式
# 方式一:通过索引选择:索引是从0开始的 每一个option都有索引
s1.select_by_index(0)
# 方式二:通过value属性的值
# s1.select_by_value('o4')
# 方式三:通过文本选择
# s1.select_by_visible_text("搜狗搜索")

10、文件上传

  • 使用 send_keys 方法上传文件:使用 send_keys 方法可以模拟用户通过输入框选择文件上传的操作。具体代码如下:
# 定位文件上传输入框
file_input = driver.find_element_by_xpath("//input[@type='file']")

# 发送文件路径到文件上传输入框
file_input.send_keys("C:/path/to/your/file")

  • 使用 AutoIT 工具上传文件:AutoIT 是一个针对 Windows操作系统的脚本语言,可以使用它来实现上传文件操作。具体步骤如下:
    下载安装 AutoIT 工具,并编写上传文件脚本。
    在 Python 中通过 subprocess 模块调用 AutoIT 脚本,实现上传文件操作。

AutoIT 脚本示例(上传一个名为 “file.txt” 的文件):

WinWaitActive("打开")
Send("C:\path\to\your\file\file.txt")
Send("{ENTER}")

import subprocess

# 调用 AutoIT 脚本上传文件
subprocess.Popen("upload_file.exe")

四、断言信息

断言是一种非常重要的验证方法,通常用于检查测试结果是否符合预期。通过断言,可以将测试用例的预期结果和实际结果进行比较,并在测试失败时立即报告错误,以便快速定位问题和修复缺陷。

1、通过文本信息

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
# 打开浏览器
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
# 打开网页
driver.get("http://www.baidu.com")
# 定位搜索框
serach_box = driver.find_element_by_id('kw')
# 输入内容
serach_box.send_keys("python")
# 调用回车键
serach_box.send_keys(Keys.ENTER)
time.sleep(3)
# 回去搜索出来的第一页的所有内容标题
# find_elements_by_xpath 如果定位元素的方法显示的是elements,多个元素存在一个列表中
titles = driver.find_elements_by_xpath('//div[@id="content_left"]//h3')
# 由于获取的结果是一个列表,要获取内容,则必须遍历列表,一个一个获取
for t in titles:
    # 获取文本信息
    print(t.text)

2、根据title信息做断言

# 获取网页标题  python_百度搜索
  print(driver.title)

3、根据url判断

# 获取当前网页的url
  print(driver.current_url)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值