UI自动化测试


一.自动化测试

  • 定义:可以理解为通过一定的技术手段,操作机器来得到人的模拟操作

  • 目的:&意义:随着产品的完善,需要回顾验证的测试点越来越多,这个时候我们可以通过自动化测试的技术的手段,把需要回归的测试点中,可以使用自动化测试实现的部分实现,那么这样,我们需要回归测试的点就会减少,已实现的部分可以一劳永逸。

  • 分类:

    • UI自动化测试:(前端自动化测试)--->selenium(工具&框架&库)

    • API自动化测试

    • 单元自动化测试

二.UI自动化测试

  • 环境搭建

    • 安装selenium第三方库:pip3 install selenium

    • 安装Chrome浏览器

    • 下载浏览器对应的驱动,然后把Chromedriver放在python的安装目录下

      • 查看浏览器的版本(设置--->关于chrome--->版本号)

      • 到http://npm.taobao.org/mirrors/chromedriver/下载对应版本的驱动

      •  下载后解压到python的目录下,然后以管理员身份运行,控制台跳出以下代码表示安装成功

        Only local connections are allowed.
        Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
        ChromeDriver was started successfully.
  • 查看selenium版本

  • 查看元素定位方法

    • 查看方法

    •  结果

  • 单个元素定位方法的的使用

    • id定位方法

      • 查看id
      •  通过代码实现自动化测试:
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")   
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_id("kw").send_keys("python")
        #按照页面属性id定位到输入框并输入“python”
        driver.find_element_by_id("su").click()
        #按照页面属性id定位到百度一下并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • name定位方法

      • 查看name方法同上
      • 代码
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_name("wd").send_keys("python")#send_keys是输入
        #按照页面属性name定位到输入框并输入“python”
        driver.find_element_by_id("su").click()#click是点击
        #按照页面属性id定位到百度一下并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • class name定位方法

      • 查看classname方法同上
      • 代码
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_class_name("s_ipt").send_keys("python")#send_keys是输入
        #按照页面属性class name定位到输入框并输入“python”
        driver.find_element_by_id("su").click()#click是点击
        #按照页面属性id定位到百度一下并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • xpath定位方法(在前面方法使用不了的情况下使用)

      • 查看xpath方法

      •  代码
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python")
        #按照页面属性xpath定位到输入框并输入“python”
        driver.find_element_by_xpath('//*[@id="su"]').click()#click是点击
        #按照页面属性xpath定位到百度一下并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • css selector 定位方法

      • 查看css selector方法

      •  代码:
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_css_selector('#kw').send_keys("python")
        #按照页面属性css selector定位到输入框并输入“python”
        driver.find_element_by_css_selector('#su').click()#click是点击
        #按照页面属性css selector定位到百度一下并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • link text 超链接精确定位方法

      • 查看属性是否为超链接

      •  代码
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_link_text("新闻").click()#click是点击
        #按照页面属性超链接定位“新闻”并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    • partial link text 超链接模糊定位方法

      • 查看属性是否为超链接方法如上
      • 代码
        from selenium import webdriver
        import  time as t
        #导入库
        driver=webdriver.Chrome()
        #指定被测的浏览器并且对webdriver进行实例化
        driver.get("http://www.baidu.com/")
        #导航到被测网址
        t.sleep(2)
        #停留2秒
        driver.find_element_by_partial_link_text("hao").click()#click是点击
        #按照页面属性超链接模糊定位“hao123“并点击
        t.sleep(3)
        #停留5秒
        driver.quit()
        #退出
    •  tag name定位方法

      • tag_name可以理解为是标签,怎么理解了,就是就是百度搜索输入框,它的标签是input,那么针对这种我们可以使用标签的方式来进行,使用到的方法是ftag_name

      • 测试代码如下:

        from selenium import  webdriver
        import  time as t
        
        driver=webdriver.Chrome()
        driver.get('http://www.baidu.com')
        driver.find_element_by_tag_name('input').send_keys('UI自动化测试')
        t.sleep(3)
        driver.quit()

         当我们执行以上代码的时候,就会报错:

        F:\python\code\testshare\练习\share\练习.py:11: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
          driver.find_element_by_tag_name('input').send_keys('UI自动化测试')
        Traceback (most recent call last):
          File "F:\python\code\testshare\练习\share\练习.py", line 11, in 
            driver.find_element_by_tag_name('input').send_keys('UI自动化测试')
          File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 540, in send_keys
            self._execute(Command.SEND_KEYS_TO_ELEMENT,
          File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 710, in _execute
            return self._parent.execute(command, params)
          File "F:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
            self.error_handler.check_response(response)
          File "F:\Python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
            raise exception_class(message, screen, stacktrace)
        selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
          (Session info: chrome=96.0.4664.45)
        Stacktrace:
        Backtrace:
            Ordinal0 [0x01146903+2517251]
            Ordinal0 [0x010DF8E1+2095329]
            Ordinal0 [0x00FE2710+1058576]
            Ordinal0 [0x01008993+1214867]
            Ordinal0 [0x010080DF+1212639]
            Ordinal0 [0x010264D3+1336531]
            Ordinal0 [0x01003A36+1194550]
            Ordinal0 [0x010265BA+1336762]
            Ordinal0 [0x01035BBF+1399743]
            Ordinal0 [0x0102639B+1336219]
            Ordinal0 [0x010027A7+1189799]
            Ordinal0 [0x01003609+1193481]
            GetHandleVerifier [0x012D5904+1577972]
            GetHandleVerifier [0x01380B97+2279047]
            GetHandleVerifier [0x011D6D09+534521]
            GetHandleVerifier [0x011D5DB9+530601]
            Ordinal0 [0x010E4FF9+2117625]
            Ordinal0 [0x010E98A8+2136232]
            Ordinal0 [0x010E99E2+2136546]
            Ordinal0 [0x010F3541+2176321]
            BaseThreadInitThunk [0x7755FA29+25]
            RtlGetAppContainerNamedObjectPath [0x77B27A9E+286]
            RtlGetAppContainerNamedObjectPath [0x77B27A6E+238]

        出现这个问题说明元素定位找不到,导致错误,那么有可能是定位到的元素属性是错误,还有一种是我们需要索引的方式来解决。

如果是后者,是单个元素定位的方式无法解决的,多个元素定位方法可以解决,如下。 

  • 多个元素定位方法

  • 需求:当元素属性的ID,name等完全一致的时候,无法使用单个元素定位的方式来解决,那么可以使用多个元素定位的方式来进行

 

  • 解决思路:获取元素的属性是一个列表,看我们被定位的目标属性是在第几位,通过索引来定位

 

  • 如上面百度搜索输入框为案例,我们前面使用的是input标签的方式进行定位的,但是我们通过查找标签发现input有8个标签,不是唯一性的:
  •  针对这种元素不是唯一性的,就可以使用多个元素定位方法解决,多个元素获取到的是一个列表,那么我们就可以使用列表的索引进行定位,通过上图我们得知搜索框的索引为7,测试代码如下:
    from selenium import  webdriver #导入库里面的模块
    import time as t    #导入库
    
    driver=webdriver.Chrome()
    driver.get("http://www.baidu.com")
    tags=driver.find_elements_by_tag_name("input")  #把查找到的是一个列表,给他一个变量tags
    tags[7].send_keys("UI自动化测试")    #在列表中索引为7的位置(也就是搜索框)输入“UI自动化测试”
    t.sleep(3)   #停留/等待三秒
    driver.find_element_by_id("su").click() #点击搜索
    t.sleep(3)
    driver.quit()#关闭
  • iframe框架定位方法

    • 需求:如QQ邮箱的的登录页面,登录按钮是在一个框架中如QQ邮箱的的登录页面,登录按钮是在一个框架中如QQ邮箱的的登录页面,登录按钮是在一个框架中

       我们通过查看源代码的方式也可以看到他是在一个frame的框架中

    • 解决思路:首先进入框架,再定位到元素操作

    • id方法:

      from selenium import webdriver#导入库的模块
      import time as t#导入库
      driver=webdriver.Chrome()#进入要操作的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("https://mail.qq.com/")#进入要测试的网址
      driver.switch_to.frame("login_frame")#进入到要操作的框架
      driver.find_element_by_link_text("帐号密码登录").click()#定位到元素并点击
      driver.quit()#退出浏览器
    • name方法:

      from selenium import webdriver#导入库的模块
      import time as t#导入库
      driver=webdriver.Chrome()#进入要操作的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("https://mail.qq.com/")#进入要测试的页面
      t.sleep(3)#停留3秒
      driver.switch_to.frame("login_frame")#通过name进入框架
      t.sleep(3)#停留三秒
      driver.find_element_by_link_text("帐号密码登录").click()#定位到元素并点击
      t.sleep(3)#停留3秒
      driver.quit()#退出
    • 索引方法:

      from selenium import webdriver#导入库的模块
      import time as t#导入time库
      driver=webdriver.Chrome()#进入测试的浏览器
      driver.maximize_window()#浏览器最大化 
      driver.get("https://mail.163.com/") #进去需要测试的页面
      t.sleep(5)#停留5秒
      driver.switch_to.frame(0)#通过索引进入模块
      driver.find_element_by_name("email").send_keys("242134")#定位到元素进行操作
      t.sleep(5)#停留5秒
      driver.quit()#退出
  •  浏览器属性

    • current_url:获取测试的地址

      from selenium import webdriver #导入库中的模块
      driver=webdriver.Chrome() #打开测试需要使用的浏览器
      driver.maximize_window()    #浏览器最大化
      driver.get("http://www.baidu.com")  #进入测试的网页
      print("测试的地址:",driver.current_url)  #输出测试网页的地址
      assert driver.current_url.endswith("baidu.com/")==True  #assert 断言:期望结果与实际结果是否相符
      driver.quit()  #退出浏览器

       输出结果:

      测试的地址: https://www.baidu.com/
    • page_source:获取测试页面的源代码

      from selenium import webdriver #导入库中的模块
      driver=webdriver.Chrome()#测试需要使用的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("http://www.baidu.com")#测试页面的网址
      print("页面源代码:",driver.page_source)#获取源代码并且输出
      driver.quit()#退出
    • title:获取页面的title

      from selenium import webdriver #导入库中的模块
      driver=webdriver.Chrome()#测试需要使用的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("http://www.baidu.com")#测试页面的网址
      print("页面的title:",driver.title)#获取页面的title并输出
      #assert 断言:期望结果与实际结果是否相符
      assert driver.title=="百度一下,你就知道"#判断页面的title是否为“百度一下,你就知道”
      driver.quit()#退出浏览器

      输出结果:

      页面的title: 百度一下,你就知道
    • 也面对前进forw后退back和刷新refre

      from selenium import webdriver #导入库中的模块
      import time as t #导入库
      driver=webdriver.Chrome()#测试需要使用的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("http://www.baidu.com")#进入测试页面A的网址
      t.sleep(3)#停留3秒
      driver.get("https://cn.bing.com/")#进入测试页面B的网址
      t.sleep(3)#停留3秒
      driver.back()#后退一步,会进入页面A
      print("页面地址",driver.current_url)#输出页面地址
      t.sleep(3)#停留3秒
      driver.forward()#前进一步,会进入页面B
      print("页面地址:",driver.current_url)#输出页面地址
      driver.find_element_by_id('sb_form_q').send_keys("123421")#定位到输入框,输入内容
      t.sleep(3)#停留3秒
      driver.refresh()#刷新页面
      t.sleep(3)#停留3秒
      driver.quit()#退出浏览器
    • 页面的切换

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.baidu.com") #测试的页面A
      nowHandler=driver.current_window_handle#定义当前页面(页面A)
      t.sleep(3)#停留3秒
      driver.find_element_by_partial_link_text("hao").click()#超链接定位属性hao123,并点击,会跳转到页面B
      t.sleep(3)#停留3秒
      allHandlers=driver.window_handles#定义所有页面(页面A和页面B)
      driver.switch_to.window(nowHandler)#切换到当前页面(页面A)
      t.sleep(3)#停留3秒
      for item in allHandlers: #对所有页面进行循环
          if item!=nowHandler:#如果不是当前页面(页面A),那就是页面B,定义为item
              driver.switch_to.window(item)#切换到另外一个页面(页面B)
              t.sleep(3)#停留3秒
              driver.find_element_by_xpath('//*[@id="search"]/form/div[2]/input').send_keys("hao123")#通过xpath方法定位到搜索框输入hao123
              t.sleep(3)#停留3秒
              driver.find_element_by_xpath('//*[@id="search"]/form/div[3]/input').click()#定位到搜索按钮,点击,会跳转到一个新的页面(页面C)
              t.sleep(3)#停留3秒
              driver.close()#退出这个页面(页面B),就会剩页面A跟页面C
              t.sleep(3)#停留3秒
      driver.switch_to.window(nowHandler)#进入当前页面(页面A)
      t.sleep(3)#停留3秒
      driver.find_element_by_id("kw").send_keys("baidu")#定位到输入框输入baidu
      t.sleep(3)#停留3秒
      driver.quit()#退出浏览器
    • clear清空

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.baidu.com") #进入测试的页面
      t.sleep(3)#停留3秒
      os=driver.find_element_by_id("kw")#定位到搜索框定义为os
      os.send_keys("python")#输入框搜索python
      t.sleep(3)#停留3秒
      os.clear()#清空输入框
      t.sleep(3)#停留3秒
      driver.quit()#退出浏览器
    • get_attribute获取元素属性的值(提示信息)

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.lagou.com")#进入测试页面
      t.sleep(3)#停留3秒
      driver.find_element_by_link_text("登录").click()#点击超链接
      t.sleep(3)#停留3秒
      login=driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div/div[2]/div[3]/div[1]/div/div[2]/form/div[1]/div/input')#定位到输入框并定义
      print("元素属性的值为:",login.get_attribute("placeholder"))#输出元素属性的值
      t.sleep(3)#停留3秒
      driver.quit()#退出浏览器

      输出结果:

      元素属性的值为: 请输入常用手机号
    • 所有在input里面输入的值,都是value的属性

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.baidu.com")#进入测试页面
      t.sleep(3)#停留3秒
      so=driver.find_element_by_id("kw")#定位到输入框并定义为so
      so.send_keys("python")#输入python
      t.sleep(3)#停留3秒
      print("value的值:",so.get_attribute("value"))#输出value的值
      driver.quit()#退出浏览器

      输出结果:

      value的值: python 
    •  is_displayed()查看元素是否可见

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.baidu.com")#进入测试页面
      t.sleep(3)#停留3秒
      aboutBaidu=driver.find_element_by_link_text("关于百度")#定位到元素“关于百度”并定义
      print("是否可见:",aboutBaidu.is_displayed())#判断是否可见并输出
      driver.quit()#退出浏览器

      输出结果:

      是否可见: True
    • is_enabled:是否可编辑(readonly:只读属性)

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("http://www.baidu.com")#进入测试页面
      t.sleep(3)#停留3秒
      aboutBaidu=driver.find_element_by_id("kw")#定位到输入框并定义
      print("是否可以编辑/输入:",aboutBaidu.is_enabled())#判断是否可以编辑/输入并输出
      driver.quit()#退出浏览器

      输出结果:

      是否可以编辑/输入: True
    • is_selected:判断单选按钮是否勾选

      from selenium import webdriver   #导入库里面的模块
      import time as t    #导入库
      driver=webdriver.Chrome() #测试使用的浏览器
      driver.maximize_window() #浏览器最大化
      driver.get("https://mail.sina.com.cn/")#到需要测试的页面
      autoLogin=driver.find_element_by_id("store1")#定位到单选按钮
      t.sleep(3)#停留3秒
      print("点击前是否勾选:",autoLogin.is_selected())#判断单选按钮是否勾选并输出
      t.sleep(3)#停留3秒
      autoLogin.click()#点击单选按钮
      t.sleep(3)#停留3秒
      print("点击后是否勾选:",autoLogin.is_selected())#判断单选按钮是否勾选并输出
      driver.quit()#退出浏览器

      输出结果:

      点击前是否勾选: True
      点击后是否勾选: False
  • 下拉框的属性选择(使用以下页面代码操作)

    "en">
    
        "UTF-8">
        Title
    
    
    
    喜欢的编程语言:
    html
    • 索引方法

      from selenium import webdriver   #导入库里面的模块
      from selenium.webdriver.support.select import Select #导入模块
      import time as t    #导入库
      driver=webdriver.Chrome()#测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面
      t.sleep(2)#停留2秒
      nr=driver.find_element_by_id("nr")#定位到下拉框并定义
      select=Select(webelement=nr)#Select类的实例化
      select.select_by_index(3)#根据索引选择属性
      t.sleep(3)#停留3秒
      driver.quit()#退出
    • value方法

      from selenium import webdriver   #导入库里面的模块
      from selenium.webdriver.support.select import Select #导入模块
      import time as t    #导入库
      driver=webdriver.Chrome()#测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面
      t.sleep(2)#停留2秒
      nr=driver.find_element_by_id("nr")#定位到下拉框并定义
      select=Select(webelement=nr)#Select类的实例化
      select.select_by_value("Java")#根据value选择属性
      t.sleep(3)#停留3秒
      driver.quit()#退出
    • 文本方法

      from selenium import webdriver   #导入库里面的模块
      from selenium.webdriver.support.select import Select #导入模块
      import time as t    #导入库
      driver=webdriver.Chrome()#测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('file:///F:/python/code/testdev/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/demo.html')#打开需要测试的页面
      t.sleep(2)#停留2秒
      nr=driver.find_element_by_id("nr")#定位到下拉框并定义
      select=Select(webelement=nr)#Select类的实例化
      select.select_by_visible_text('Java语言')#根据文本选择属性
      t.sleep(3)#停留3秒
      driver.quit()#退出
    • 拉勾网下拉框实战

      from selenium import webdriver   #导入库里面的模块
      from selenium.webdriver.support.select import Select #导入模块
      import time as t    #导入库
      driver=webdriver.Chrome()#测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("https://www.lagou.com/")#进入需要测试的页面
      t.sleep(2)#停留2秒
      driver.find_element_by_id('search_input').send_keys("测试开发工程师")#定位到输入框并输入“测试开发工程师”
      t.sleep(2)#停留2秒
      driver.find_element_by_id('search_button').click()#定位到搜索并点击
      t.sleep(2)#停留2秒
      driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/i').click()#定位到学历要求下拉框并点击
      t.sleep(3)#停留3秒
      driver.find_element_by_xpath('//*[@id="jobsContainer"]/div[2]/div[1]/div[1]/div[2]/div/ul/li[2]/div/div/ul[2]/li[4]/span').click()#选择下拉框属性并点击
      t.sleep(3)#停留3秒
      driver.quit()#退出测试