• 【web自动化测试】


    【web自动化测试】
    安装selenium库
    eg.
    安装指定版本(4.2)的库
    pip install selenium==4.2

    1、初级、中级、高级

    初级:
    selenium常见方法的基本使用
    基本web自动化测试用例编写
    中级:
    web自动化测试技巧进阶使用(显示等待、隐式等待)
    用例集成截图、日志、报告
    高级:
    PageOject设计模式
    基于pageobject模式的测试用例的编写
    资深与拓展:

    初级:

    形式章节描述
    知识点Web 自动化测试价值与体系价值体系 技术选型 学习路线
    知识点环境安装与使用selenium、 chromedriver、 firefox geckodriver
    知识点自动化用例录制selenium IDE、录制、回放、基本使用
    知识点自动化测试用例结构分析录制代码解析,代码结构优化
    知识点web 浏览器控制打开网页、刷新、回退、最大化、最小化
    知识点常见控件定位方法id name css xpath link 定位
    知识点强制等待与隐式等待介绍 selenium 经典的三种等待方式
    知识点常见控件交互方法点击,输入,清空,获取元素文本、尺寸等属性信息
    实战测试人论坛搜索功能自动化测试用例设计、用例编写、断言

    中级:

    形式章节描述
    知识点高级定位-csscss 使用场景、语法
    知识点高级定位-xpathxpath 使用场景、语法
    知识点显式等待高级使用显式等待原理与使用
    知识点高级控件交互方法右键点击、页面滑动、表单填写等自动化动作
    知识点网页 frame 与多窗口处理多窗口,多 frame 下的窗口识别与切换
    知识点文件上传弹框处理文件上传的自动化与弹框处理机制
    知识点自动化关键数据记录行为日志、截图,page source
    实战电子商务产品实战用例设计、日志封装、测试报告
    训练营知名产品web自动化测试实战用例设计、日志封装、测试报告

    高级:

    形式章节描述
    知识点浏览器复用利用远程调试技术实现自动化登录
    知识点Cookie 复用利用 cookie 复用实现自动化登录
    知识点page object 设计模式 page object 模式的发展历史介绍、六大设计原则
    知识点异常自动截图测试用例失败时自动截图
    知识点测试用例流程设计测试装置的应用,套件级别的初始化与清理、用例级别的初始化与清理
    实战电子商务产品实战 page object 设计模式应用、BasePage 封装、基于 page object 模式的测试用例编写
    训练营web自动化测试进阶实战page object 设计模式应用、BasePage 封装、基于 page object 模式的测试用例编写

    资深:

    形式章节描述
    知识点selenium 多浏览器处理chrome、firefox 等浏览器的自动化支持
    知识点执行 javascript 脚本使用 selenium 直接在当前页面中进行 js 交互
    知识点selenium option 常用操作selenium option 的介绍与使用
    知识点capability 配置参数解析capability 用法 ,firefox chrome 等浏览器的专属 capability
    知识点cypress 测试框架介绍web 自动化测试框架 cypress

    2、SeleniumIDE

    SeleniumIDE其实是浏览器上的一个插件。
    官网:https://www.selenium.dev/
    Chrome插件:https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
    Firefox插件:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/

    SeleniumIDE
    用例录制、用例集、导出脚本

    3、web浏览器控制

    打开网页、刷新、回退、最大化、最小化、强制等待

    from selenium import webdriver
    import time
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com/")  #打开百度
    #driver.minimize_window()  #页面最小化
    driver.maximize_window()  #页面最小化
    time.sleep(2)  #强制等待2秒
    driver.refresh()   #刷新浏览器,refresh是方法,所以要加括号
    driver.get("https://blog.csdn.net/")  #打开CSDN
    driver.back()  #退回上一步,即退回百度
    sleep(1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、常见控件定位方法

    (1)html

    DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>测试人论坛title>
    head>
    <body>
    <a href="https://ceshiren.com/" class="link">链接a>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    标签:
    属性:href
    类属性:class

    (2)八大定位方式
    https://www.selenium.dev/documentation/webdriver/elements/locators/

    练习网站
    https://vip.ceshiren.com/#/ui_study/

    方式描述
    class nameclass 属性对应的值
    css selector(重点)css 表达式
    id(重点)id 属性对应的值\
    name(重点)name 属性对应的值
    link text查找其可见文本与搜索值匹配的锚元素
    partial link text查找其可见文本包含搜索值的锚元素。如果多个元素匹配,则只会选择第一个元素。
    tag name标签名称
    xpath(重点)xpath表达式

    1)元素定位方式一:ID

    #格式1,举例
    driver.find_element_by_id("su")
    
    #格式2,举例,建议使用格式2
    driver.find_element(By.ID,"su")
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    eg.

    from selenium import webdriver
    import time
    from selenium.webdriver.common.by import By
    
    def id_position_method():
    
        # 实例化chromedriver
        driver = webdriver.Chrome()
        # 打开网站
        driver.get('http://www.ceshiren.com')
        # 等待一秒
        time.sleep(1)
        # 点击“精华帖”
        driver.find_element(By.ID,"ember35").click()
        # 等待两秒
        time.sleep(2)
    
    if __name__ == '__main__':
        id_position_method()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2)元素定位方式二:name

    driver.find_element(By.NAME,"Name属性对应的值“)
    
    • 1

    3)元素定位方式三:css selector (必须掌握)

    driver.find_element(By.CSS_SELECTOR, "值")
    #方式一:
    #页面右击,复制绝对定位
    
    #方式二:
    #编写css selector表达式(必须会)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4)元素定位方式四:xpath (必须掌握)

    #格式
    driver.find_element(By.XPATH, "值")
    
    #方式一:
    #页面右击,复制绝对定位
    
    #方式二:
    #编写xpath表达式(必须会)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5)元素定位方式五:链接文本
    A、一定是a标签
    B、输入的元素为标签内的文本

    driver.find_element(By.LINK_TEXT, "a标签内的文本")
    
    • 1

    5、强制等待、显示等待、隐式等待

    (1)强制等待(不确定到底需要等待多长时间,sleep时间过长会影响用例执行效率,sleep时间过短,会报错。不能解决不稳定性的问题)
    eg.

    time.sleep(3)
    
    • 1

    (2)隐式等待 (解决找不到元素的问题。因强制等待时间过短,页面未加载完成就点击元素,报no such element的错误的问题)
    eg.

    driver.implicity_wait(3) #每0.5s轮询查找元素是否出现,如果没出现就抛出异常
    
    • 1

    (3)显示等待(解决元素可以找到,但点击效果没有触发的问题。解决点击等交互性场景下的等待问题。)
    eg.

    WebDriverWait(driver, 10).util(exoexted_conditions.element_to_be_clickable((By.ID, "success_btn")))  #10是等待时长
    driver.find_element(By.ID, "success_btn").click()
    
    • 1
    • 2

    6、控件交互方法

    (1)点击

    driver.find_element(By.ID, "kw").click()
    
    • 1

    (2)输入

    driver.find_element(By.ID, "kw").send_keys("百度")
    
    • 1

    (3)清空搜索框中的信息

    driver.find_element(By.ID, "kw").clear()
    
    • 1

    (4)获取元素文本

    driver.find_element(By.ID, "id").text
    
    • 1

    (5)获取元素的属性(html的属性值)

    driver.find_element(By.ID, "id").get_attribute("name")
    
    • 1

    7、常见控件交互

    Web弹窗定位
    场景1、web页面alert弹窗
    解决1、driver.switchTo().alert()

    下拉框、日期控件定位
    场景2、
    标签组合的下拉框无法定位
    标签组合的日期控件无法定位
    解决2、引入JS注入技术

    文件上传
    场景3、input标签文件上传
    解决3、input标签直接使用send_keys()方法

    8、css表达式

    driver.find_element(By.CSS_SELECTOR, "值")
    #方式一:
    #页面右击,复制绝对定位
    
    #方式二:
    #编写css selector表达式(必须会)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (1)定位场景
    支持web产品
    支持app端的webview
    (2)绝对定位
    右击—>复制—>css表达式
    eg.

    $("#ember63 > td.main-link.clearfix.topic-list-data > span > span > a")
    
    • 1

    缺点:层级关系过于明确,当从中抽掉一层span,就会定位不到元素。即无法适应前端页面的变化
    (3)相对定位
    优势:可维护性强、语法简单、解决各种复杂场景

    $("#ember63 [title='新话题']")
    #先找id为ember63的位置,在在其下找titile为新话题的元素
    
    • 1
    • 2

    若$(“css表达式”)的方式不行,可以试试输入 $$(“css表达式”)。(可能是浏览器的原因)

    (4)css基础语法

    #标签名
    $('input')
    #.类属性值 #如果class后的值中含空格,则css表达式中空格要换成点.
    $('.s_ipt')
    #id属性值
    $('#kw')
    #[属性名='属性值']
    $('[name="wd"]')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注:
    批量修改pycharm中的变量,选中——右击——点击refactor——点击rename

    driver->self.driver,实现跨方法使用变量

    (5)css关系定位

    类型格式
    后代元素 元素
    父子元素>元素
    并集元素,元素
    邻近兄弟(了解即可)元素+元素
    兄弟(了解即可)元素1~元素2

    (6)css顺序关系

    类型格式
    父子关系+顺序元素 元素
    父子关系+标签类型+顺序元素 元素

    eg.

    #:nth-child(n)
    $('#form>input:nth-child(2)')
    #:nth-of-type(n)
    $('#form>input:nth-of-type(1)')
    
    • 1
    • 2
    • 3
    • 4

    9、xpath

    (1)定位场景
    web自动化测试
    app自动化测试
    (2)优势
    可维护性强、语法简洁、相比于css可以支持更多的方式
    (3)调试方法
    console

    $x("xpath表达式")
    
    • 1

    elements

    #ctrl+f输入xpath或者css
    
    • 1

    (4)xpath基础语法

    表达式结果
    /从该节点的子元素选取
    //从该节点的子孙元素选取
    *通配符
    nodename选取此节点的所有子节点
    选取当前节点的父节点
    @选取属性

    eg.

    # 整个页面
    $x("/")
    # 页面中的所有的子元素
    $x("/*")
    # 整个页面中的所有元素
    $x("//*")
    # 查找页面上面所有的div标签节点
    $x("//div")
    # 查找id属性为site-logo的节点
    $x('//*[@id="site-logo"]')
    # 查找节点的父节点
    $x('//*[@id="site-logo"]/..')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (5)xpath顺序关系(索引)
    xpath通过索引值直接获取对应元素

    # 获取此节点下的所有的li元素
    $x("//*[@id='ember21']//li")
    # 获取此节点下【所有的节点的】第一个li元素
    $x("//*[@id='ember21']//li[1]")
    
    • 1
    • 2
    • 3
    • 4

    (6)xpath高级用法
    [last()]: 选取最后一个
    [@属性名=‘属性值’ and @属性名=‘属性值’]: 与关系
    [@属性名=‘属性值’ or @属性名=‘属性值’]: 或关系
    [text()=‘文本信息’]: 根据文本信息定位
    [contains(text(),‘文本信息’)]: 根据文本信息包含定位
    注意:所有的表达式需要和[]结合
    eg.

    # 选取最后一个input标签
    //input[last()]
    # 选取属性name的值为passward并且属性pwd的值为123456的input标签
    //input[@name='passward' and @pwd='123456']
    # 选取属性name的值为passward或属性pwd的值为123456的input标签
    //input[@name='passward' or @pwd='123456']
    # 选取所有文本信息为'霍格沃兹测试开发'的元素
    //*[text()='霍格沃兹测试开发']
    # 选取所有文本信息包'霍格沃兹'的元素
    //*[contains(text(),'霍格沃兹')]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    following-sibling::选取当前节点之后的所有同级节点
    preceding-sibling取的是该节点之前的节点(同级同父)

    #选取当前节点td[@class="td_left" and text()="连接名称"]之后的所有同级节点
    //td[@class="td_left" and text()="连接名称"]/following-sibling::td/select/option[contains(text(), "3_OTHER_R_VID_2030")]
    
    • 1
    • 2

    10、高级控件交互方法

    键盘输入
    eg1.
    键盘按下回车

    #法一:
    self.driver.find_element(By.ID, "query").send_keys(Keys.ENTER)
    #法二:
    ActionChains(self.driver).key_down(Keys.ENTER).perform()
    
    • 1
    • 2
    • 3
    • 4

    eg2
    键盘复制粘贴

    class TestKeyBoardDemo:
        # driver 初始化
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
        # 关闭driver进程
        def teardown_class(self):
            self.driver.quit()
        # 复制粘贴逻辑
        def test_copy_and_paste(self):
            # 演练环境
            self.driver.get("https://ceshiren.com/")
            cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL
            self.driver.find_element(By.ID, "search-button").click()
            ele = self.driver.find_element(By.ID, "search-term")
            # 打开搜索,选择搜索框,输入selenium,剪切后复制,几个v就代表复制几次
            ActionChains(self.driver)\
                .key_down(Keys.SHIFT, ele)\
                .send_keys("Selenium!")\
                .send_keys(Keys.ARROW_LEFT)\
                .key_down(cmd_ctrl)\
                .send_keys("xvvvvv")\
                .key_up(cmd_ctrl)\
                .perform()
            time.sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    鼠标事件
    eg1.
    双击

    class TestMouseDemo:
    
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
    
        def teardown_class(self):
            self.driver.quit()
    
        def test_double_click(self):
            # 演练环境
            self.driver.get("https://vip.ceshiren.com/#/ui_study")
            ele = self.driver.find_element(By.ID, "primary_btn")
            ActionChains(self.driver).double_click(ele).perform()
            time.sleep(2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    eg2.
    拖动元素

    class TestMouseDemo:
    
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
    
        def teardown_class(self):
            self.driver.quit()
    
        def test_drag_and_drop(self):
            # 演练环境
            self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains")
            item_left = self.driver.find_element(By.CSS_SELECTOR,'#item1')
            item_right = self.driver.find_element(By.CSS_SELECTOR,'#item3')
            ActionChains(self.driver).drag_and_drop(item_left, item_right).perform()
            time.sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    eg3.
    悬浮

    class TestMouseDemo:
    
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
    
        def teardown_class(self):
            self.driver.quit()
    
        def test_hover(self):
            # 演练环境
            self.driver.get("https://vip.ceshiren.com/#/ui_study/action_chains2")
            time.sleep(2)
            title = self.driver.find_element(By.CSS_SELECTOR, '.title')
            ActionChains(self.driver).move_to_element(title).perform()
            options = self.driver.find_element(By.CSS_SELECTOR,'.options>div:nth-child(1)')
            ActionChains(self.driver).click(options).perform()
            time.sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    滚轮滚动
    使用条件:
    1、仅使用selenium版本>=4.2
    2、适用Chrome,不适用于Firefox

    class TestScrollDemo:
    
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
    
        def teardown_class(self):
            self.driver.quit()
        
        def test_scoll_to_element(self):
            # 演练环境  
            self.driver.get("https://ceshiren.com/")
            # 4.2 之后才提供这个方法
            ele = self.driver.find_element\
            (By.XPATH, "//*[text()='怎么写高可用集群部署的测试方案?']")
            ActionChains(self.driver).scroll_to_element(ele).perform()
            time.sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    滚轮根据坐标滚动
    eg.

    class TestScrollDemo:
    
        def setup_class(self):
            self.driver = webdriver.Chrome()
            self.driver.implicitly_wait(3)
    
        def teardown_class(self):
            self.driver.quit()
    
        def test_scroll_to_amount(self):
            # 演练环境
            self.driver.get("https://ceshiren.com/")
            # 4.2 之后才提供这个方法
            ActionChains(self.driver).scroll_by_amount(0, 10000).perform()
            time.sleep(5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    11、无头模式使用

    eg.

    from time import sleep
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    
    class TestFile:
        def setup(self):
            #添加无头模式后,运行代码,可以不直接打开浏览器。这样你可以边执行代码边办公
            options = webdriver.FirefoxOptions()  #无头模式代码
            options.add_argument('--headless')   #无头模式代码
            #options.add_argument('start-maximized')
            #options.add_argument('window-size=1920x3000')
            self.driver = webdriver.Firefox(options=options)   #无头模式代码
            self.driver.implicitly_wait(3)
            # self.driver.maximize_window()
    
        def teardown(self):
            self.driver.quit()
    
        def test_file(self):
    
            self.driver.get("http://www.baidu.com")
            self.driver.find_element(By.CSS_SELECTOR, ".soutu-btn").click()
            sleep(2)
            # self.driver.find_element(By.CSS_SELECTOR, ".upload-pic").send_keys('C:\\Users\\mayr_\\Desktop\\aaaaaaaaaa\\1.png')
            # sleep(20)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    12、浏览器复用

    (1)
    A、需要退出当前所有的谷歌浏览器(特别注意)
    B、输入启动命令,通过命令启动谷歌浏览器
    a、找到chrome的启动路径
    b、配置环境变量
    C、验证是否启动成功

    cmd下输入一下命令,会在远程9222端口打开web页面
    windows:chrome --remote-debugging-port=9222
    mac:Google\ Chrome --remote-debugging-port=9222
    (2)

    复用已有浏览器代码:

    from selenium.webdriver.chrome.options import Options
    option = Options()
    option.debugger_address = "localhost:9222"
    self._driver = webdriver.Chrome(options=option)
    self._driver.get("https://work.weixin.qq.com/wework_admin/frame")
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    Java学习笔记(三十一)
    基于WebGL、Cesium技术的三维空间可视化
    centos安装conda python3.10
    【尚硅谷】Java数据结构与算法笔记02 - 队列
    MySQL高级:(十三)数据库锁
    练[MRCTF2020]套娃
    插入损耗——线对上的信号衰减
    SAP PO运维(五):系统用户授权
    程序员自由创业周记#13:第一桶金
    说说 MVCC 的工作原理?
  • 原文地址:https://blog.csdn.net/weixin_43442758/article/details/130844456