• 软件测试进阶篇----自动化测试概述


    自动化测试

    第一层:功能测试,要求懂软件测试基础理论,Linux、数据库及其他计算机相关的知识

    • 软件测试行业的最底层(技术层面)
    • 行业知识领域的拓展(行业测试层面)
    • 初级测试

    第二层:接口测试,相对功能难一点,相比自动化简单一些

    • 企业最急需的技术要求
    • 性价比最高的(技术简单、薪资较高)
    • 初中级测试

    第三层:自动化测试,是属于中级软件测试的层次,可以定位高级测试

    • 定位中高级
    • 技术难度较高,性价比差点
    • 分类
      • UI自动化测试(通过浏览器访问UI页面的测试类型)-大测试
        • APP
        • web
        • 小程序
      • 接口自动化测试(后台服务器接口)-中测试
      • 单元测试(代码级的)-小测试

    第四层:个人持续发展

    • 测试开发岗位,需要在自动化测试脚本的基础上,结合vue、flask等框架进行测试工具的开发、二次开发等
    • 性能测试方向:测试需求分析、性能测试指标、性能测试工具使用,测试场景执行和简单测试结果分析
    • 安全测试方向:软件安全测试(代码级别安全扫描和分析)和网络安全测试(渗透测试)
    • ……

    一、自动化测试概述

    1、定义

    自动化测试就是用脚本模拟手工测试过程的一种类型,用程序来测试程序的过程

    概念中的第一个程序:

    • Python:一种语言开发脚本
    • PyCharm:IDE继承开发工具软件
    • Selenium:自动化测试框架工具

    2、自动化测试的特点

    覆盖性特点:自动化测试可以实现手工测试无法完成的覆盖要求

    时效性特点:在短时间内完成大量的工作、长时间的进行测试

    重复性特点:对于重复性工作、简单的工作,交给自动化,测试工程师就可以做更加有价值的事情了

    适用于回归测试阶段,目的是提高测试执行的效率。

    自动化测试是为了发现更多新的bug嘛?能发现bug嘛?

    系统持续迭代更新的时候适合使用自动化,但是需求频繁变更则不适用

    3、自动化测试工具

    uft(通用功能性测试),是cs、bs架构系统通用的自动化测试工具,现在属于microfocus公司,属于商业软件

    selenium(硒),只支持bs架构的,是一种开源软件

    公司自研软件:测试开发的一个方向

    二、自动化测试流程

    你上家公司是怎么做自动化测试的?自动化测试的流程是什么?你在自动化测试中参与了什么工作内容?

    image-20230918154715309

    1、确定自动化测试的介入点

    前提是项目需要开展自动化测试了(而是项目负责人或者BOSS认为需要开始做自动化了)

    系统级测试完成之后的回归测试阶段介入自动化测试。(系统比较稳定、迭代的需求)

    2、需求分析和测试计划阶段

    技术可行性分析:当前团队中的技术是否满足要求,需要采样分析。

    需求分析:可以复用功能测试阶段的分析结果

    测试计划:5w1h

    3、测试设计

    自动化测试用例设计(模板和功能测试的有差别,但也不大),不是一成不变的,需要不断地维护(增加、修改、删除),版本管理。

    自动化测试环境搭建:

    • 被测系统
    • Python3
    • pycharm
    • selenium
    • unittest/pytest
    • git分布式版本管理工具/svn集中式版本管理工具
    • jenkins:持续集成工具

    自动化脚本开发:版本管理和脚本的合并

    4、测试执行

    要求:无人值守的测试执行、输出可视化的报告(html格式)、邮件自动发送等

    准备:异常处理(在测试用例的适当位置添加异常处理)、场景还原(每次执行脚本需要还原一次数据库)

    5、输出测试报告、测试总结

    输出一个可视化的报告即可

    6、持续改进

    pdca质量环(戴明环)

    把本轮测试的经验、教训进行汇总、分析、研讨、作为下一次执行经验使用

    三、Selenium基础

    1. selenium简介

      selenium是一个验收工具(回归测试工具,是运行在Chrome、firefox、edge、safari常见浏览器上的)

      selenium最早版本是js开发的,慢慢地支持多种语言平台,python、java

    2. selenium的版本

      • selenium1.0:selenium ide、selenium rc(rc:remote control远程控制,js脚本控制浏览器)、selenium grid

        • selenium rc工具是用js开发的,直接操作浏览器的元素
        • 浏览的类型不同、版本不同,直接导致脚本不稳定
      • selenium2.0:selenium ide、selenium rc、selenium grid、webdriver(是Google的一个产品)

        • webdriver工具,使用浏览器驱动来屏蔽掉浏览器的区别、差异,
        • 作为自动化测试工程师,只需要关注自动化脚本的开发即可(客户端代码)
        • 提升了代码的稳定性
      • selenium4.0:selenium ide、selenium grid(分布式执行)、webdriver(是Google的一个产品)

    3. selenium IDE

      火狐浏览器的一个插件,是可以直接录制自动化脚本、结合不同的开发语言导出脚本的工具

      selenium ide是入门级自动化测试工程师、业务相关人员用的,适用于语言能力较差、不能自己写代码的。

      1. 安装ide插件

      2. ide工具的基本使用

        启动录制脚本,默认打开浏览器对应的baseurl地址

        下面将在页面上进行业务操作了,代码会被录制下来,直到关闭浏览器。

        回到selenium ide界面,停止录制

        输入脚本名称,点击ok,就完成百度搜索的脚本录制了

      3. 查看录制的脚本

        每一句代码都是由三部分组成的(关键字脚本开发):

        • command:步骤中对页面元素的操作的动作、命令、事件等
        • target:操作的对象是页面元素,通过各种页面元素属性来定位(id、name、class等)
        • value:有一些对象是需要值的,有的不需要
      4. 运行脚本

        调整下运行速度适中

      5. 通过关键字开发脚本

        加上断言步骤

      6. 导出测试脚本

        选中脚本名右侧三个点,弹出菜单选择export,选择Python pytest框架的脚本

      7. 导出后文件可以直接运行或者改造

      • katalon是和selenium ide类似的一个工具,可以导出python+unittest框架的代码

        作为练习,自己做一下。

    4. selenium客户端环境配置

      我们选择的是python客户端,python语言下结合selenium实现脚本开发

      1. 安装Python3
      2. 安装selenium4.12.0
      3. 安装浏览器驱动(server端)
        1. 下载驱动文件,解压到Python的安装根目录下即可。
      4. 写一个简单的自动化测试代码
        • 打开火狐浏览器
        • 打开百度首页
        • 输入“CSDN叫我王同学”
        • 点击百度一下
        • 关闭浏览器

    四、webdriver api常见的用法

    selenium4=selenium ide+grid+webdriver

    selenium是标准的C/S架构的系统:

    • c-client:指的就是webdriver开发的自动化脚本
    • s-server:浏览器
    • 原理:使用C端的自动化脚本来操作S端浏览器上的页面元素的过程就是自动化,驱动屏蔽掉了浏览器的差异化

    一、页面元素及操作

    1、页面元素

    html页面上的各种标签:

    • input标签
      • password
      • text
      • radio
      • check box
      • button
      • ….
    • button标签
    • img标签
    • a标签
    • h标签
    • p段标签
    • span标签
    • div标签
    • select下拉列表
    • option
    • form标签

    知道对象是什么了,如何去定位到这个对象

    2、定位元素

    from selenium.webdriver.common.by import By

    driver.find_element(By.xx,“yy”)

    1. id属性定位

      id是标签的唯一性属性(h5技术中的一个强制要求),而且要求每个标签都应该有id属性。

      如果标签有id属性,定位元素的第一选择就是id属性定位。

      driver.find_element(By.ID,“”)

    2. name属性定位

      h5未做强制的唯一性的要求,属性要求必须具备,可以作为第二选择

      find_element(By.NAME,””)

    3. tag name标签名属性定位

      在一个页面上相同标签名的标签会有很多,就很难做到唯一性定位元素了。

      • find_element(By.TAG_NAME,“”):返回的是页面元素对象,返回页面第一个出现指定标签的元素
      • find_elements(By.TAG_NAME,“”):返回的是页面元素对象的列表
    4. class名属性定位

      把相同、相似功能标签,划分在同一个类中,一个类属性一定对应这个标签。

      • find_element(By.CLASS_NAME,“”):返回的是页面元素对象,返回页面第一个出现指定标签的元素
      • find_elements(By.CLASS_NAME,“”):返回的是页面元素对象的列表
    5. 标签的文本信息定位

      适用于超链接和按钮元素,

      使用的定位方式是:xxxx< /a>

      • link text:要求文本信息必须是完整的
      • partial link text:部分信息就可以定位
    6. xpath定位

      xml文件:现在主要是作为一些配置文件中使用

      xpath:路径,是最早在xml文档中用于标签定位的一种语法,被html引入并使用

      xpath其实就是一种根据html页面的结构树(DOM),通过标签所在的位置进行定位的一种技术

      方式1:绝对路径表示法:从HTML根节点开始定位

      ​ /:表示根节点,父节点和子节点之间的连接符

      ​ []:同名的兄弟节点关系,索引号是从1开始的,不写默认为1(出现的第一个同名节点)百度文本框的绝对路径:

      方式2:相对路径结合属性定位

      ​ //:中间任意节点

      ​ 表示一个id属性为kw的任意input标签://input[@id=”kw”]

      ​ 表示一个name属性为wd的任意标签://*[@name=“wd”]

      方式3:相对路径定位

      ​ //form[@id=“form”]/span/input

      方式4:直接浏览器上复制

      相对路径://*[@id=“su”]

      绝对路径:/html/body/div[2]/div[2]/div[5]/div[1]/div/form/span[2]/input

    7. CSS select定位

      css_selector:层叠样式选择器定位方法,定位的效率要比xpath要高、css的语法结构要比xpath更简洁

      • 类选择器:**.**类名

      • id选择器:**#**id名

      • 标签选择器:input input**.**aa input#bb

      • >:表示父子节点关系

      • +:表示同级别兄弟节点关系

      • [属性=“属性值”]:比较通用,[id=“id值”]

        from selenium import webdriver
        from selenium.webdriver.common.by import By
        import time
        
        # 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
        driver = webdriver.Chrome()
        
        # 打开百度首页
        driver.get("https://www.baidu.com")
        
        # 通过标签结合类属性的css定位百度文本框并输入字符串
        # driver.find_element(By.CSS_SELECTOR, 'input.s_ipt').send_keys('CSDN叫我王同学')
        # driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('CSDN叫我王同学')
        # driver.find_element(By.CSS_SELECTOR, 'form#form > span > input').send_keys('CSDN叫我王同学')
        driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('CSDN叫我王同学')
        time.sleep(2)
        
        # 定位百度一下并点击
        # driver.find_element(By.ID, 'su').click()
        driver.find_element(By.CSS_SELECTOR, 'form#form>span+span>input').click()
        time.sleep(2)
        
        
        # 关闭浏览器对象
        driver.quit()
        
        • 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
    8. 定位器的选择方式

      • 只要有id属性就用id定位
      • 如果是超链接,就用link text定位
      • 如果没有属性,可以使用xpath
      • 如果xpath和css之间要选择css
    3、页面元素操作

    定位只是第一步,定位之后需要对这个元素进行操作,或单击(按钮)或输入(输入框)。

    webdriver中最常用的几个方法:

    • clear():清除文本

    • send_keys(value):模拟按键输入,还可以输入组合键和功能键,可以用于上传文件(标签必须是input)

    • click():单击元素。例如按钮、超链接操作

    • current_url:返回当前页面的url地址

    • title:返回当前页面的title

    • text:获取页面(提示框、警告框)显示的文字

    • get_attribute(name):获得属性值,文本框中的值用value属性名

    • is_displayed():检查该元素是否用户可见

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      import time
      
      # 创建浏览器对象
      driver=webdriver.Chrome()
      
      # 打开百度首页
      driver.get('https://www.baidu.com')
      
      # 获取当前页面的url,并打印出来(driver.current_url)
      cURL = driver.current_url
      print(cURL)
      
      # 获取当前页面的title,并打印出来(driver.title)
      cTitle = driver.title
      print(cTitle)
      
      # 获取百度首页底部的链接文本信息:把百度设为主页关于百度About  Baidu百度推广
      cText=driver.find_element(By.CSS_SELECTOR,'#bottom-layer > div').text
      print(cText)
      
      # 百度“selenium”,点击百度一下
      driver.find_element(By.ID,'kw').send_keys('selenium')
      
      # 判断页面中的“百度一下”按钮是否正常显示,是则打印“正常显示按钮”
      if(driver.find_element(By.ID,'su').is_displayed()):
          driver.find_element(By.ID,'su').click()
          print('正常显示按钮')
      time.sleep(2)
      
      # 获取文本框中的文字,并打印出来
      # get_attribute():可以获取一个元素对象的属性的值,如果参数给value,则返回的是数据
      cValue = driver.find_element(By.ID,'kw').get_attribute('value')
      cId = driver.find_element(By.ID,'kw').get_attribute('id')
      cName = driver.find_element(By.ID,'kw').get_attribute('name')
      print(cValue)
      print(cId)
      print(cName)
      
      # 清除百度文本框中内容
      driver.find_element(By.ID,'kw').clear()
      cValue1 = driver.find_element(By.ID,'kw').get_attribute('value')
      print(cValue1)
      time.sleep(2)
      
      # 关闭浏览器
      driver.close()
      
      • 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
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48

    二、浏览器操作

    1、基本操作

    对浏览器的窗口的大小、浏览器的位置、前进、后退、刷新、截屏、关闭等操作。

    • 窗口大小操作

      • set_window_size()
      • maximize_window()
      • minimize_window()
    • 窗口的位置操作:set_window_position(x,y)

    • 前进:forward()

    • 后退:back()

    • 刷新:refresh()

    • 截屏:save_screenshot()

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      import time
      
      # 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
      driver = webdriver.Chrome()
      # 可以调整浏览器窗口的大小和位置
      # driver.set_window_size(500,500)
      
      # 建议创建完driver对象之后,立马最大化、最小化显示
      driver.maximize_window()
      time.sleep(2)
      # driver.minimize_window()
      # time.sleep(5)
      
      # 调整位置
      # driver.set_window_position(500,500)
      
      # 打开百度首页
      driver.get("https://www.baidu.com")
      driver.find_element(By.ID, 'kw').send_keys('CSDN叫我王同学')
      driver.find_element(By.ID, 'su').click()
      time.sleep(2)
      # 先后退到百度首页
      driver.back()
      time.sleep(2)
      # 再前进到搜索页
      driver.forward()
      time.sleep(2)
      
      # 刷新下页面
      driver.refresh()
      time.sleep(2)
      
      # 截图保存到本地
      driver.save_screenshot(r'd:\aa.png')
      
      # 关闭浏览器对象
      driver.quit()
      
      • 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
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
    2、多窗口操作

    浏览器中多于一个窗口的时候就是多窗口,这时候如何操作不同窗口的页面元素的

    # 百度首页,通过id属性定位百度文本框和百度一下按钮
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    
    # 创建浏览器对象,对该对象的操作,实际上就是对浏览器的操作
    driver = webdriver.Chrome()
    
    # 打开百度首页
    driver.get("https://www.baidu.com")
    
    # 点击新闻按钮
    driver.find_element(By.LINK_TEXT, '新闻').click()
    time.sleep(2)
    
    # 查看当前窗口(只有一个)的句柄名
    # current_window_handle
    cHandle = driver.current_window_handle
    print(cHandle)
    # 3867737E15CEC331B212F81402762A39
    
    cHandle1 = driver.current_window_handle
    print(cHandle1)
    
    # window_handles:返回所有窗口句柄的集合
    handles = driver.window_handles
    print(handles)
    
    # driver对象能处理的窗口是第一个打开的哪个窗口,每个窗口其实是有名字的(句柄handle)
    # 将driver对象切换给第二个窗口,进行操作
    # switch_to.window(句柄名)
    driver.switch_to.window(handles[1])
    
    # 在此处截屏
    time.sleep(4)
    driver.save_screenshot(r'd:\bb.png')
    driver.find_element(By.LINK_TEXT, '河北两座特高压变电站扩建工程同时开工').click()
    time.sleep(2)
    
    
    # 关闭浏览器对象
    driver.quit()
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    三、鼠标和键盘操作

    鼠标和键盘操作都是应用在浏览器中,是webdriver中提供的使用方法。

    1、鼠标操作

    主要是为了实现更丰富的交互,有鼠标点击、鼠标悬浮、鼠标右键、双击、拖动

    实现步骤:

    • 先导包:from selenium.webdriver.common.action_chains import ActionChains
    • 绑定鼠标对象和浏览器,鼠标只能操作当前浏览器:ActionChains(driver)
    • 封装鼠标对象的动作:click()、move_to_element()、drag_and_drop()
    • 具体实现动作:perform()

    案例1:鼠标的点击功能

    # 使用鼠标的点击功能,点击百度首页的新闻按钮
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    # 创建浏览器对象
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    
    # 封装要操作的对象
    on_element = driver.find_element(By.LINK_TEXT, '新闻')
    ActionChains(driver).click(on_element).perform()
    
    time.sleep(3)
    
    # 关闭浏览器
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    案例2:鼠标的悬浮功能

    # 使用鼠标的悬浮功能,将鼠标悬浮在百度首页的设置按钮上
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    # 创建浏览器对象
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    
    # 封装要操作的对象
    to_element = driver.find_element(By.ID, 's-usersetting-top')
    ActionChains(driver).move_to_element(to_element).perform()
    
    time.sleep(3)
    
    driver.find_element(By.LINK_TEXT, '搜索设置').click()
    time.sleep(3)
    
    # 关闭浏览器
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    案例3:鼠标的拖拽功能

    # 使用鼠标的拖拽功能,鼠标将一个元素拖拽到另一个原宿舍
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    # 创建浏览器对象
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('xxx')
    
    # 拖拽方法功能
    source = driver.find_element(By.ID, 'xxx')
    targe = driver.find_element(By.ID, 'xxx')
    # ActionChains(driver).drag_and_drop(source,targe).perform()
    ActionChains(driver).drag_and_drop_by_offset(source, 270, 200).perform()
    
    time.sleep(3)
    
    # 关闭浏览器
    # driver.quit()
    driver.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    2、键盘操作

    在webdriver中有keys模块(Keys类),定义大量类变量,每个变量表示一个键盘按键

    都是采用**send_keys()**来键入键盘上的按键,可以单个字符键,也可以是组合键和功能键。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    # 导入键盘操作的模块
    from selenium.webdriver.common.keys import Keys
    import time
    
    # 创建浏览器对象
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    
    # 键盘事件案例:
    # 1、百度“selenium”
    driver.find_element(By.ID, 'kw').send_keys('seleniumm')
    time.sleep(1)
    
    # 2、删除多输入的m
    driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE)
    time.sleep(1)
    
    # 3、再输入“空格  教程”
    driver.find_element(By.ID, 'kw').send_keys(Keys.SPACE)
    time.sleep(1)
    driver.find_element(By.ID, 'kw').send_keys('教程')
    time.sleep(1)
    
    # 4、ctrl+a,全选文本框内容
    driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'a')
    time.sleep(1)
    
    # 5、ctrl+x,剪切文本框内容
    driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'x')
    time.sleep(1)
    
    # 6、ctrl+v,粘贴文本框内容
    driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL, 'v')
    time.sleep(1)
    
    # 7、回车代替单击,完成搜索
    driver.find_element(By.ID, 'kw').send_keys(Keys.ENTER)
    time.sleep(3)
    
    # 8、退出浏览器
    driver.quit()
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    四、弹框处理

    浏览器中的弹框,基本都是JavaScript处理的,常见的有三类:

    • alert:就只有一个确定按钮,也叫警告框
    • confirm:有确定和取消两个按钮,叫确认框
    • prompt:确认、取消还有一个文本框,消息框

    对于软件测试来说,处理方式都一样(这些弹框不能被页面元素定位):

    需要将driver切换给弹框:driver.switch_to.alert

    对弹窗的处理方式:

    • accept():点弹框的确定按钮
    • dismiss():点取消按钮
    • text:获取弹框的提示信息
    • send_keys():给prompt这种弹框输入文字的
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    # 创建浏览器对象
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com')
    
    # 封装要操作的对象
    to_element = driver.find_element(By.ID, 's-usersetting-top')
    ActionChains(driver).move_to_element(to_element).perform()
    
    time.sleep(3)
    
    driver.find_element(By.LINK_TEXT, '搜索设置').click()
    time.sleep(3)
    
    # 修改设置
    driver.find_element(By.ID, 's1_2').click()
    time.sleep(2)
    # 保存设置
    driver.find_element(By.LINK_TEXT, '保存设置').click()
    time.sleep(2)
    
    # 先获取警告框上的文本,再点警告框的确认按钮
    # driver对象切到警告框
    a = driver.switch_to.alert
    # 获取文本
    textS = a.text
    print(textS)
    
    # 点击确定按钮
    a.accept()
    time.sleep(2)
    
    # 关闭浏览器
    driver.quit()
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    五、多frame嵌套的处理

    frame/iframe是h5中的一个标签,可以实现页面的嵌套,如果想操作嵌套页面就需要切换:driver.switch_to.frame()

    三种切换方式:

    • 一层层往里切:driver.switch_to.frame()
    • 一层层往外切:driver.switch_to.parent_frame()
    • 一次性往外切:driver.switch_to.default_content()
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    import time
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://mail.qq.com')
    # 基本版按钮是属于外层页面的,直接可以操作
    # 想要操作密码登录按钮,需要往里切两层
    # 方式1:参数是frame标签对象
    element = driver.find_element(By.CSS_SELECTOR, '#QQMailSdkTool_login_loginBox_qq > iframe')
    driver.switch_to.frame(element)
    
    # 方式2:再进入第三层,参数可以为name属性值
    driver.switch_to.frame('ptlogin_iframe')
    
    # 切换完成之后,就可以点击第三层的页面元素了
    driver.find_element(By.ID, 'switcher_plogin').click()
    time.sleep(5)
    
    # 此处点不了基本版超链接,需要再切出去
    # 一层层往外切
    # driver.switch_to.parent_frame()
    # driver.switch_to.parent_frame()
    # 一次性切出
    driver.switch_to.default_content()
    
    driver.find_element(By.LINK_TEXT, '基本版').click()
    
    time.sleep(5)
    
    driver.quit()
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    六、时间等待

    主要是解决由于网络加载慢、中间页面跳转或者异步加载情况下,页面元素定位不到的问题

    1、强制等待

    是一种代码暂停运行的技术

    time.sleep(2)

    2、隐式等待

    对整个页面中的所有元素有效,用到哪个元素都可以按照隐式等待时间进行等待。

    好处:定义20s隐式等待,页面10s就加载完了,等10s;2s就加载完了等2s;25s还没加载完,就抛出超时异常

    建议:定义完driver对象之后,最大化显示,再加上该隐式等待

    # 创建浏览器对象
    self.driver = webdriver.Chrome()
    self.driver.maximize_window()
    # 加入隐式等待的方法
    self.driver.implicitly_wait(10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3、显式等待

    针对页面上某一个特定的元素的等待。

    WebdriverWait(driver,超时时间,刷新频率).util(条件)

    • expect_conditions中提供的定位方法作为util的条件,可以为True或者False
    • 如果是True返回要定位的页面元素对象
    • 如果为False抛出超时异常
  • 相关阅读:
    `算法题解` `AcWing` 4507. 子数组异或和
    数据仓库架构详解
    vue实战入门后台篇六:springboot+mybatis实现网站后台-前端登录功能对接
    音视频八股文(11)-- ffmpeg avio 内存输入和内存输出。内存输出有完整代码,网上很少有的。
    怎样翻译文本?这三种翻译方法我经常使用
    MIPI CSI-2笔记(18) -- 数据格式(RAW图像数据)
    Python---while循环的执行流程 解释
    学习记忆——数学篇——案例——算术——绝对值三角不等式
    【 C++ 】特殊类设计
    LinEnum提权辅助脚本使用指南
  • 原文地址:https://blog.csdn.net/qq_44985444/article/details/134023181