美文网首页
Selenium基础知识及使用unittest简单重构

Selenium基础知识及使用unittest简单重构

作者: 程序员lsq | 来源:发表于2020-11-05 13:18 被阅读0次

UI -Selenium自动化测试

什么是自动化测试

  1. 什么是测试

  2. 测试的分类

  3. 什么是自动化测试

  4. 自动化测试的技术选型

什么是测试:

  • 测试就是运行程序,并发现程序中的错误

  • 验证软件的正确性 ,完整性,安全性和质量的过程

  • 用程序员的话就是找bug

  • 软件测试是一个过程

自动化测试

什么是自动化测试

  • 自动化测试就是,假定一些预设值,由机器自动完成的测试: 机器+设定=自动化

web自动化的技术选型

  1. 发展趋势要稳定上升

  2. 活跃的社区

  3. 开源软件

  4. 支持主流编程语言

  5. 支持主流浏览器

Selenium

  1. Selemium WebDriver

  2. Selenium IDE

  3. Selenium Grid


Selenium WebDriver

  • Selenium 、webDriver 是客户端API接口,测试人员通过调用这些接口,来访问浏览器驱动,浏览器驱动再访问浏览器

WebDriver <------>Remote WebDriver<--->Driver<----->Browser

WebDriver<------>Selenium Server or Grid<--------->Driver<------->Browser

Selenium IDE

  • 帮助初学者建立简单的测试用例代码

Selenium Grid

  • 分布式的测试环境


环境搭建


  1. Selenium
     pip install selenium
  1. 浏览器驱动

    1. https://www.selenium.dev/documentation/en/webdriver/driver_requirements/

    2. 设置环境变量:把下载的浏览器器驱动所在的目录添加到系统path 中

Selenium 核心技术

  1. Selenium实现元素定位

  2. Seenium WebDriver属性

  3. Selenium WebDriver方法

Selenium实现元素定位

# 方法名称 方法描述
1 find_element_by_id 通过ID定位元素
2 find_element_by_xpath 通过xpath定位
3 find_element_by_link_text 通过连接文本定位
4 find_element_by_partial_link_text 通过连接部分文本定位
5 find_element_by_name 通过标签名称定位
6 find_element_by_tag_name 通过标签名称定位
7 find_element_by_class_name 通过CSS Class定位

Selenium WebDriver方法

# 方法 描述
1 driver.back() 浏览器后退
2 driver.forward() 浏览器前进
3 driver.refresh() 浏览器刷新
4 driver.close() 关闭当前窗口
5 driver.quit() 退出浏览器
6 driver.switch_to.frame() 切换到frame
7 driver.switch_to.alert 切换到alert
8 driver.switch_to.active_element 切换到活动元素

Selenium WebElement

  • 我们使用WebDriver的find方法定位到元素后,会返回一个WebElement对象

    # 属性 属性描述
    1 ID 标示
    2 size 宽高
    3 rect 宽高和坐标
    4 tag_name 标签名称
    5 text 文本内容
    # 方法 方法描述
    1 send_keys() 输入内容
    2 clear() 清空内容
    3 click() 单击
    4 get_attribute() 获得属性值
    5 is_selected() 是否被选中
    6 is_enabled() 是否可用
    7 is_displayed() 是否显示
    8 value_of_css_property() css属性值

Selenium 操作form

  • 操作流程

    1. 定位表单元素

    2. 输入测试值

    3. 判断表单元素属性

    4. 获得表单元素属性

    5. 提交表单进行验证

Selenium 操作CheckBox和radiobutton

  • from表单中也会用到checkbox和radiobutton

    • checkbox

      • 如果checkbox有id 属性可以直接通过id定位,如果没有可以通过input标签名称定位,然后通过type属性过滤

      • 选择或反选checkbox,使用click()方法

    • radiobutton

      • radiobutton有相同的名称,多个值,可以先通过名称获得,然后通过值判断

      • 选择或者反选checkbox,使用click()方法

Selenium 操作下拉列表

# 方法/属性 方法/属性描述
1 select_by_value() 根据值选择
2 select_by_index() 根据索引选择
3 select_by_visible_text 根据文本选择
4 deselect_by_value 根据值反选
5 deselect_by_index 根据索引反选
6 deselect_by_visibile_text 根据文本反选
7 deselect_all 反选所有
8 options 所有选项
9 all_selected_options 所有选中项
10 first_selected_option 第一个选择选项

Selenium 处理弹窗

  • 页面弹窗有三种

    • alert:用来提示

    • confirm:用来确认

    • prompt: 输入内容

      • # 方法/属性 方法/属性描述
        1 accept() 接受
        2 dismiss() 取消
        3 text 显示的文本
        4 sends_keys 输入内容

Selemium 三种等待方式

  1. time.out(固定等待)

    • 方便快捷,在正式项目不建议使用
  2. implicitly_wait(隐式等待)

    • 设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束为止

    • 页面元素加载完成但javasc代码未加载完

    • 隐式等待对整个driver周期都起作用,在最开始设置一次就够了

  3. WebDriverWait(显式等待)

    • WebDriverWait是Selenium 提供得到显式等待模块引入路径:
  from selenium.webdriver.support.wait import WebDriverWait

  • WebDriverWait参数

    # 参数 参数说明
    1 driver 传入WebDriver实例
    2 timeout 超时时间,等待的最长时间
    3 poll_frequency 调用until 或until_not中的方法的间隔时间,默认是0.5秒
    4 ignored_exceptions 忽略的异常

    在这个模块中一共只有两种方法until ,until_not

    # 参数 参数说明
    1 method 在等待期间,每个一段时间调用这个传入的方法,直到返回值不是false
    2 message 如果超时,抛出TimeoutException, 将message 传入异常

Seleium 等待条件

  • 1 title_is 判断title,是否出现
    2 title_contains 判断title,是否包含某些字符
    3 presence_of_element_located 判断某个元素是否被添加到了DOM树里,并不代表该元素一定可见
    4 visibility_of__element_located 判断某元素是否被添加到了DOM中并且可见,宽高都大与0
    5 visibility_of 判断元素是否可见,如果可见就返回这个元素
    6 presence_of_all_elements_located 判断是否至少有一个元素存在dom树种
    7 visibility_of_any_elements_located 判断是否至少有一个元素在页面中可见
    8 text_to_present_in_element 判断指定元素是否包含了预期的字符串
    9 text_to_present_in_element_value 判断指定元素的属性值是否包含了预期的字符串
    10 frame_to_present_available_and_switch_to_it 判断frame是否可以switch进去
    11 invisibility_of_element_located 判断某个元素是否存在于DOM或不可见
    12 element_to_be_clickable 判断某个元素是否是可见并且是enable的,代表可点击
    13 staleness_of 等待某元素从dom树中移除
    14 element_of_to_be_selected 判断某元素是否被选中
    15 element_selection_state_to_be 判断某元素选中状态是否符合预期
    16 element_located_selection_state_to_be 判断某元素选中状态是否符合预期
    17 alert_is_present 判断页面上是否存在alert

Selenium鼠标和键盘事件

  • Selenium 中的鼠标和键盘事件被封装在ActionChains 类中,正确的使用方法是:

  • ActionChains(driver).click(btn).perform()

    # 方法 方法描述
    1 click(on_element=None) 单击鼠标左键
    2 click_and_hold(on_element=None) 点击鼠标左键不松开
    3 context_click(on_element=None) 点击鼠标右键
    4 double_click(on_element=None) 双击鼠标左键
    5 drag_and_drop(source, taeget) 拖拽某个元素然后松开
    6 drag_and_drop_by_offset(source, xoffset, yoffset) 拖拽某个元素到某个坐标后松开
    7 key_down(vlaue, element=None) 按下键盘上的某个键
    8 key_up(value,element=None) 松开某键
    9 move_by_offset(xoffset, yoffset) 鼠标从当前位置移到某个坐标
    10 move_to_element(to_element) 鼠标移到某个元素
    11 move_to_element_with_offset(to_element, xoffset, yoffset) 移到某个元素多少距离的位置
    12 perform() 执行链中的所有动作
    13 rekease(on_element =None) 在某个元素位置松开鼠标左键
    14 send_keys(*keys_to_send) 发送某个键到当前焦点元素
    15 send_keys_to_element(element, *keys_to_send) 发送某个键到指定元素

Selenium 执行JavaScript脚本

  • execute_script :同步执行

  • execute_async_script : 异步执行

Selenium 屏幕截图

# 方法 方法描述
1 save_screenshot(filename) 获取当前屏幕截图,保存为指定文件,filename指定保存路径或者文件名
2 get_screenshot_as_base64 获取当前屏幕截图base64编码字符串
3 get_screenshot_as_file(fimename) 获取当前屏幕截图,使用完整的路径
4 get_screenshot_as_png() 获取当前屏幕截图的二进制文件数据

Selenium 定位frame iframe

# 方法 方法描述
1 switch_to.frame(reference) 切换frame,reference时传入参数,用来定位frame,可以传入id, name, index ,以及Selenium的WebElement对象
2 switch_to.default_content() 返回主文档
3 switch_to.parent_frame() 返回父文档

项目重构

使用unittest重构

什么是unittest

  • unittest 是Python 单元测试框架,类似于JUnit

  • 5个重要的概念:test fixture, test case, test suite, test runner, test loader

    1. TestCase

      • 一个TestCase的实例就是一个从测试用例

        [测试用例] 一个完整的测试流程,包括测试前准备环境的搭建(setup),执行测试代码(run),以及测试后环境的还原(tearDown)。一个测试用例就是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证

      • Test suite

        • 多个测试用例集合在一起,就是TestSuite,而且TestSuite 也可以嵌套TestSuite
      • Test runner

        • 执行测试用例,run(test) 会执行TestSuite/TestCase 中的run(result)方法
      • TestLoader

        • 加载TestCase 到TestSuite 中,loadTestsFrom__()就是从各个地方寻找TestCase,创建它们的实例,然后add 到TestSuite中,再返回一个TestSuite实例
      • Test fixture

        • 对一个测试用例环境的搭建和销毁是一个fixture,通过覆盖TestCase 的setUp()和tearDown()方法来实现

unittest中的方法

  • 方法分类:

    • 类方法:只执行一次

    • 实例方法:每次运行用例都执行

  • 执行顺序

    • setUpClass--> setUP---->testA----->tearDown----->setup------>testB--->tearDown----->tearDownClass

    • 用例之间按用例名称ASCII码的顺序加载,0~9, AZ,az

断言

方法 检查
assertEqual(a,b) a==b
assertNotEqual(a,b) a!=b
assertTrue(x) bool(x) is True
asserFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIsNot(a,b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a,b) a in b
assertInNot(a,b) a not in b
assertIsInstance(a,b) isinstance(a,b)
assertNotIsInstance(a,b) not isinstance(a,b)

加载测试用例的四种方法

  1. 实例化

    • suite = unittest.TestSuite()

    • loader = unittest.TestLoader()

  2. 通过测试用例类进行加载

    • suit.addTest(loader.loadTestFromTestCase(MyTest1))

    • suit.addTest(loader.loadTestFromTestCase(MyTest2))

  3. 通过测试模板

    • suit.addTest(loader.loadTestFromTestMoudle(MyTest1))

    • suit.addTest(loader.loadTestFromTestMoudle(MyTest2))

  4. 通过路径加载

   import os
    path = os.path.dirname(os.path.abspath(__file__))
    suit.addTEst(loader.discover(path))
  1. 逐条加载测试用例

    • case1 = MyTest1("test1")

    • case2 = MyTest2("test2")

    • suite.addTest(case1)

    • suite.addTest(case2)

重构

  1. 习惯测试用例基础: unittest.TestCase
  2. init 修改为 setup
  3. 将assert 断言修改为unittest断言
  4. 关掉浏览器放到teardown
  5. 测试顺序要加序号 :test1、test2

相关文章

网友评论

      本文标题:Selenium基础知识及使用unittest简单重构

      本文链接:https://www.haomeiwen.com/subject/wfzgvktx.html