Notion Blog
技术分享1 分钟阅读

selenium 使用场景和示例

【基于UI的自动化测试开发 在实际项目中合适的介入场景/条件是什么?】

一。 项目背景方面

项目生命周期较长(软件有稳定的客户需求,升级或客户定制版本不断的推出); 并且被测软件有较多或繁琐业务流程等 在每轮迭代中 需要反复测试操作。
被测软件本身需求、界面设计、业务流程/功能 基本稳定, 选择要开发为脚本的功能或业务部分已经没有重大的bug

二。技术方面 1. 能找到适合于本项目技术特点的 自动开发工具。 工具选择原则:团队成员掌握工具所需的基本技能、工具本身基本成熟且有维护支持、工具使用成本能承受(开源)

开发的配合,能提供界面设计方面的协助。

【基于selenium工具自动化的基本原理】

通过webDriver(浏览器驱动程序) 间接控制浏览器的动作。
selenium包提供的 主要是 webdriver的API(应用程序编程接口)

【准备好对应selenium工具体系的环境】

浏览器 品牌和版本
对应webdriver 品牌和版本
selenium库 确定某一版本(3.141.0) (下载指定开发语言对应的版本)
开发语言常见 python java javascript C#

【可能的辅助工具】

selenium IDE 录制并生成脚本的工具 (它是firefox浏览器的插件)
用图像识别方式 定位非HTML页面元素时 采用的sikuly(java)工具。以及 python 调用java程序的桥梁--- "JPype1"
生成测试报告的 HTML测试执行器 (第3方模块) 【编码工具】 eclipse+JDK+pydev +(eclipse的svn插件) 或 Pycharm(要对应操作系统平台)

【selenium 基本功能】

selenium中最重要的实例(对象)

1) webdriver实例, 怎么得到 ---> “实例化对应浏览器的webdriver类”得到。 先导入webdriver模块, 再使用webdriver中某一个浏览器的webderiver类 完成实例化 例如: driver = webdriver.Chrome()

创建好实例后, 才能通过该driver实例 调用各种操作浏览器的方法

2)webElement实例。 它是怎么得到的? 通过driver.find_element() 方法执行后 得到的返回值 driver.find_element(By.??, “value”).click()

input0bj = driver.find_element(By.??, “value”)  # 通过变量名 保存该返回值
inputObj.clear()
inputObj.send_keys("value")

3). actionChains实例 (模拟鼠标或键盘动作), 该实例怎样得到?

导入该类 ac = ActionChain(driver) # 通过driver 实例化得到

执行模拟动作的模式: 安排动作->安排动作->安排动作。。->统一执行动作

例1 : ac.move_to_element().click().send_keys().perform()

例2: "在商品管理模块的商品信息编辑中,输入商品详细描述信息"

# 导入模拟动作事件 类
from selenium.webdriver.common.action_chains import ActionChains
#实例化动作事件类, 需要使用driver去初始化
ac = ActionChains(self.driver)
#开始"安排动作"-- 调用各种动作方法
div_tabbody = self.driver.find_element_by_id("tabbody-div")
ac.move_to_element_with_offset(div_tabbody , 200, 200)
ac.double_click()
ac.send_keys("商品详情描述案例文本")
#按之前动作的调用顺序 集中执行所有的动作
ac.perform()
#动作执行完后 清空所有的动作
ac.reset_actions()

4) 特殊元素定位警告弹窗操作 alert实例, 该实例怎样得到的? 通过driver.switch_to.alert 返回得到的

alt = driver.switch_to.alert
alt.text  # 获取弹窗中的文本
alt.accept()  # 点击弹窗的 "确认"
alt.dismiss()  # 点击弹窗的 "取消"
切换新窗口
js = 'window.open("http://172.31.25.122/admin");'
driver.execute_script(js)
#获取当前商品句柄
windows = driver.window_handles
#切换到新窗口
driver.switch_to.window(windows[-1])
嵌入子页面窗口切换 用ID 或者name
driver.switch_to.frame("menu-frame")
退出回到首页面
driver.switch_to.default_content()
用例收集
loader = TestLoader()
#收集用例的路径
project_path = os.path.dirname(os.getcwd())
收集用户的条件
suite = loader.discover(project_path, "test*.py")

2.【driver对象的常用方法】

1) get() 2) quit() 3) find_element()

find_elements() # 该方法如果未找到任何元素不会报错,返回空列表 4) switch_to 5) implicitly_wait(秒数) # 隐式元素识别的智能等待

3.【find_element方法的几种方式】

id、name、classname tagname link_text、 partial_link_text xpath css_selector

xpath 可以同时从 标签的名称、属性、文本值、层次关系4个维度定位, 准确度高且灵活。

xpath基本语法格式: //步/步/.../ 每一步的通式: 标签名[修饰方式] 索引 整数值从1开始 @属性=‘值’ text()=‘值’ /../../ 在xpath中可以用两点 表示上一层标签

// 表示不定子层。 例如 table//td 表示table标签下无论哪一层的td 都匹配

css和xpath语法相似

标签名[属性修饰]>标签名[属性修饰]

其中id属性和class属性 不需要写在方括号中 id属性用 # 号

class属性用 . 号

css的特点, 部分只能通过元素样式 定位的场景 只有通过css selector方式实现 例如: input:checked 表示定位被选中的单选框或复选框

【Python单元测试框架 unittest】

导入包 import unittest
通常用4要素方式来理解unittest

2.1) 测试固定动作

def setUp(self)  # 测试代码前置动作方法
def  tearDown(self)    # 测试代码后置动作方法    

2.2) 测试方法

def  test****(self)# 必须以小写test开头

这两个要点 都是写在测试类中。

定义测试类的要求:

class  类名(uinttest.TestCase):   # 测试类要继承自 unittest包下的TestCase类。

2.3) 测试集 unittest.TestSuite类, 实例化该类 可以创建收集测试方法的"容器"

userSide_testsuite = unittest.TestSuite()  # 创建了一个测试集实例
adminSide_testsuite = unittest.TestSuite()

给测试集"容器" 中增加测试方法2种方式:

1: 是一个测试加载器的discover方法 自动收集指定包下面的符合匹配标准的 测试模块中的测试方法

 tests = unittest.defaultTestLoader.discover(startdir=r"c:\\workspace\\Testcase", pattern='*test.py')
 userSide.addTests( tests )  # 往测试集容器中 加入被discover方法找到的 所有"测试方法"

2: 手动实例化测试类中的方法,然后加入测试集容器

假设有测试类为:

class TestLogin(unittest.TestCase):
 	def test_Loginsuc(self):
 		pass
  def test_LoginFail(self):
               pass

创建测试类中某一测试方法的实例
 t1 = TestLogin("test_Loginsuc")  # 实例化了 第一个测试对象,该对象只包含 test_Loginsuc 测试方法
 t2 = TestLogin("test_LoginFail")    # 实例化了 第二个测试对象,该对象只包含 test_LoginFail 测试方法
 adminSide_testsuite.addTests( [t1,t1,t1,t1,t2]  )

2.4) 测试执行器:

1.unittest自带的 TextTestRunner类 2. 第三方的 HTMLTestRunner类, 它在HTMLTestRunner.py 模块中实例化测试执行器类后, 调用实例的run方法 把测试收集好测试方法的 测试集传递给run方法执行

   
   runner = TextTestRunner()
   runner.run(adminSide_testsuite)
   runner2 = TextTestRunner(adminSide_testsuite)
	 runner2.run(suite)

selenium 简单示例

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('https://cn.bing.com/')
time.sleep(0.5)
driver.find_element(by=By.ID,value='sb_form_q').send_keys(kw)  # 找到元素进行输入
driver.find_element(by=By.ID,value='search_icon').click()  # 找到元素触发点击事件
time.sleep(2)
text = driver.find_element(by=By.ID,value='b_results').text #获取元素下所有的text
print(text)
driver.close() # 关闭浏览器

开启无头浏览器访问

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
driver = webdriver.Chrome(chrome_options=chrome_options) 
driver.get('https://cn.bing.com/')
time.sleep(0.5)
driver.find_element(by=By.ID,value='sb_form_q').send_keys(kw)
driver.find_element(by=By.ID,value='search_icon').click()
time.sleep(2)
text = driver.find_element(by=By.ID,value='b_results').text
print(text)
driver.close()

有关使用上的问题,欢迎您在底部评论区留言,一起交流~

读者评论

评论会同步写入该文在 Notion 中的页面底部(与正文同页,便于管理)。

0/1500

暂无评论,欢迎抢沙发。