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 <module>
            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

三.selenium中类的使用

  • Select:针对下拉框的属性选择操作

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <center>
        喜欢的编程语言:
        <select id="nr">
            <option  value="" selected>请选择您喜欢的编程语言</option>
            <option value="Python">Python语言</option>
            <option value="Go">Go语言</option>
            <option value="Java">Java语言</option>
        </select>
    </center>
    </body>
    </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()#退出测试
  •  Alert类:针对弹出框的操作处理

    • 方法:

      • text:获取弹出框的文本信息
      • accept是接受Confirm弹出框
      • dismiss是拒绝接受Confirm弹出框
      • send_keys是在Prompt消息对话框里面输入想要输入的内容
    • 警告框

      from selenium import  webdriver #导入selenium库的webdriver包
      from selenium.webdriver.common.by import By   #导入By模块
      from selenium.webdriver.common.action_chains import ActionChains    #导入ActionChains模块
      import  time as t  #导入time库
      
      driver=webdriver.Chrome()   #打开测试的浏览器并定义
      driver.maximize_window()    #浏览器最大化
      driver.get('http://www.baidu.com')   #打开需要测试的网址
      driver.implicitly_wait(30)   #添加时间限制,如果30秒没有打开被测试网站,就会报错
      locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#获取到百度设置的元素属性
      action=ActionChains(driver=driver)  #针对ActionChains类的实例化
      action.move_to_element(locator).perform()   #将鼠标移动到定位到元素的位置并执行
      t.sleep(5)  #停留5秒
      driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#点击搜索设置
      t.sleep(5)  #停留5秒
      driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#点击保存设置
      t.sleep(5)  #停留5秒
      print('警告框的文本信息为:',driver.switch_to.alert.text)#获取到弹出框的文本信息并输出
      driver.quit()#退出

      输出结果:

      警告框的文本信息为: 已经记录下您的使用偏好
    • 确认框

      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script type="text/javascript">
              function disp_confirm()
              {
                  var r=confirm("请您点击按钮!")
                  if(r==true)
                  {
                      document.write("您点击了确认按钮")
                  }
                  else
                  {
                      document.write("您点击了取消按钮")
                  }
              }
          </script>
      </head>
      <body>
      <center>
          <input type="button" onclick="disp_confirm()" value="请点击">
      </center>
      </body>
      </html>
      测试页面源代码

      测试代码如下:

      from selenium import  webdriver #导入selenium库的webdriver包
      from selenium.webdriver.common.by import By   #导入By模块
      from selenium.webdriver.common.action_chains import ActionChains    #导入ActionChains模块
      import  time as t  #导入time库
      
      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/%E6%B6%88%E6%81%AF%E4%BA%A4%E4%BA%92%E6%A1%86/%E4%BA%A4%E4%BA%92%E6%A1%86.html')
      #打开需要测试的页面
      t.sleep(3)#停留3秒
      driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素并点击
      t.sleep(3)#停留3秒
      driver.switch_to.alert.accept()#选择确认
      t.sleep(3)#停留3秒
      driver.refresh()#点击确定
      driver.find_element_by_xpath('/html/body/center/input').click()#定位到按钮元素并点击
      t.sleep(3)#停留3秒
      driver.switch_to.alert.dismiss()#选择取消
      t.sleep(3)#停留3秒
      driver.quit()#退出
    • 消息对话框

      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script type="text/javascript">
              function disp_prompt()
              {
                  var name=prompt("请输入您的姓名:","")
                  if(name!=null && name!="")
                  {
                      document.write("Hello "+name+"")
                  }
              }
          </script>
      </head>
      <body>
      <center>
          <input type="button" onclick="disp_prompt()" value="请点击我!">
      </center>
      </body>
      </html>
      测试页面源代码

       测试代码如下:

      from selenium import  webdriver #导入selenium库的webdriver包
      from selenium.webdriver.common.by import By   #导入By模块
      from selenium.webdriver.common.action_chains import ActionChains    #导入ActionChains模块
      import  time as t  #导入time库
      
      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/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86/%E6%B6%88%E6%81%AF%E5%AF%B9%E8%AF%9D%E6%A1%86.html')
      #进入需要测试的页面
      t.sleep(2)#停留2秒
      driver.find_element_by_xpath('/html/body/center/input').click()#定位到元素并点击
      t.sleep(2)#停留2秒
      driver.switch_to.alert.send_keys("特昂糖")#定位到输入框并输入内容
      t.sleep(3)#停留3秒
      driver.switch_to.alert.accept()#点击确认按钮
      t.sleep(3)#停留3秒
      driver.quit()#退出测试
  • ActionChains类:针对鼠标事件的操作

    • 悬浮:move_to_element

      from selenium import  webdriver #导入selenium库的webdriver包
      from selenium.webdriver.common.by import By   #导入By模块
      from selenium.webdriver.common.action_chains import ActionChains    #导入ActionChains模块
      import  time as t  #导入time库
      
      driver=webdriver.Chrome()   #打开测试的浏览器并定义
      driver.maximize_window()    #浏览器最大化
      driver.get('http://www.baidu.com')   #打开需要测试的网址
      driver.implicitly_wait(30)   #添加时间限制,如果30秒没有打开被测试网站,就会报错
      locator=driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')#获取到百度设置的元素属性
      action=ActionChains(driver=driver)  #针对ActionChains类的实例化
      action.move_to_element(locator).perform()   #将鼠标移动到定位到元素的位置并执行
      t.sleep(5)  #停留5秒
      driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click()#点击搜索设置
      t.sleep(5)  #停留5秒
      driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()#点击保存设置
      t.sleep(5)  #停留5秒
      print('警告框的文本信息为:',driver.switch_to.alert.text)#获取到弹出框的文本信息并输出
      driver.quit()#退出

      输出结果:

      警告框的文本信息为: 已经记录下您的使用偏好
    • 右键单击:context_click

      from selenium import webdriver#导入模块
      from selenium.webdriver.common.action_chains import ActionChains#导入模块
      import time as t#导入库
      
      driver=webdriver.Chrome()#打开测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('https://pan.baidu.com/')#打开测试的页面
      t.sleep(3)#停留3秒
      driver.find_element_by_id('TANGRAM__PSP_4__smsSwitchWrapper').click()#点击短信快捷登录
      t.sleep(3)#停留3秒
      driver.find_element_by_id('TANGRAM__PSP_4__smsPhone').send_keys('XXXXXXXXXX')#输入手机号
      t.sleep(3)#停留3秒
      driver.find_element_by_id('TANGRAM__PSP_4__smsTimer').click()#点击发送验证码
      t.sleep(20)#停留20秒
      driver.find_element_by_id('TANGRAM__PSP_4__smsSubmit').click()#点击登录
      t.sleep(10)#停留10秒
      obj=ActionChains(driver=driver)#ActionChains类的实例化
      ceshi=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[2]/div[3]/div/div/dd[3]/div[2]/div[1]/a')#获取元素属性的对象
      t.sleep(3)#停留3秒
      obj.context_click(ceshi).perform()#右键单击
      t.sleep(3)#停留3秒
      driver.quit()#退出测试

      测试页面是以百度网盘为例

    • 双击:double_click

      from selenium import webdriver#导入模块
      from selenium.webdriver.common.action_chains import ActionChains#导入模块
      import time as t#导入库
      driver=webdriver.Chrome()#打开测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get("https://www.baidu.com")#打开测试的页面
      t.sleep(3)#停留3秒
      obj=ActionChains(driver=driver)
      driver.find_element_by_id('kw').send_keys("python自动化测试")#定位到元素并输入
      t.sleep(3)#停留3秒
      so=driver.find_element_by_id("su")#定位到元素并定义
      obj.double_click(so).perform()#双击元素
      t.sleep(3)#停留3秒
      driver.quit()#退出测试
  • WebDriverWait类:等待

在UI的自动化测试中,经常会由于网络加载慢的问题导致资源加载不出来,从而影响测试的效率,之前我们对这样的处理方案是使用了time库里面的sleep()方法来休眠几秒钟,但是这样的方式毕竟不是很好的解决方案。

在UI自动化测试中,关于等待的部分,主要汇总为如下三点,具体如下:

1、固定等待,也就是使用sleep()方法 2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间(隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步) 3、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpection的异常信息

    • WebDriverWait参数

      driver: 传入WebDriver实例,即我们上例中的driver
      timeout: 超时时间,等待的最长时间
      poll_frequency: 调用until或until_not中的方法的间隔时间,默认是0.5秒
      ignored_exceptions: 忽略的异常,如果在调用until或until_not的过程中抛出这个元组中的异常,则不中断代码,继续等待,
      如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有NoSuchElementException

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

      until:当某个元素出现或者条件成立则会继续执行
      until_not:当某元素消失或什么条件不成立则继续执行

      method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False message: 如果超时,抛出TimeoutException,将message传入异常
    • 实战(以百度首页为例)

      • 隐式等待实战

        '''模块跟库的导入'''
        from selenium import webdriver
        from selenium.webdriver.support.wait import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as es
        import time as t
        
        driver=webdriver.Chrome()#测试测浏览器
        driver.maximize_window()#浏览器最大化
        driver.get("http://www.baidu.com")#测试的页面
        '''设置一个隐式等待时间30秒,在这个时间内页面加载完成会进行下一步,如遇网络不良情况规定时间未完成加载就会报错'''
        #隐式等待
        driver.implicitly_wait(30)
        #显示等待
        '''当期望的元素出现才会继续执行,时间限制10秒,没出现条件就会报错'''
        wait=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,'kw')))
        wait.send_keys("等待")#元素中输入内容
        t.sleep(3)#固定等待3秒
        driver.quit()#退出测试
      • 指定元素的文本位置

        '''模块跟库的导入'''
        from selenium import webdriver
        from selenium.webdriver.support.wait import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as es
        import time as t
        
        driver=webdriver.Chrome()
        driver.maximize_window()
        driver.implicitly_wait(30)
        driver.get("https://mail.sina.com.cn/")
        #点击登录按钮
        driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=WebDriverWait(driver=driver,timeout=10).until(
            es.element_to_be_clickable((
                By.XPATH,
                '/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')))
        t.sleep(3)
        
        assert divText.text=='请输入邮箱名'
        driver.quit()
      • 元素是否可见

        '''模块跟库的导入'''
        from selenium import webdriver
        from selenium.webdriver.support.wait import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as es
        import time as t
        
        
        driver=webdriver.Chrome()
        driver.maximize_window()
        driver.implicitly_wait(30)
        driver.get("http://www.baidu.com")
        aboutBaidu=WebDriverWait(
            driver=driver,
            timeout=10).until(
            es.element_to_be_clickable((
                By.LINK_TEXT,'关于百度')))
        aboutBaidu.click()
        driver.quit()
  •  keys模块:键盘事件

    • 模块的导入

      from selenium.webdriver.common.keys import Keys
    • 方法的查看

          NULL = u'\ue000'
          CANCEL = u'\ue001'  # ^break
          HELP = u'\ue002'
          BACKSPACE = u'\ue003'
          BACK_SPACE = BACKSPACE  #删除键
          TAB = u'\ue004'  #TAB键
          CLEAR = u'\ue005'
          RETURN = u'\ue006'
          ENTER = u'\ue007'  #回车键
          SHIFT = u'\ue008'  #shift键
          LEFT_SHIFT = SHIFT
          CONTROL = u'\ue009'   #Ctrl键
          LEFT_CONTROL = CONTROL
          ALT = u'\ue00a'
          LEFT_ALT = ALT
          PAUSE = u'\ue00b'
          ESCAPE = u'\ue00c'
          SPACE = u'\ue00d'
          PAGE_UP = u'\ue00e'
          PAGE_DOWN = u'\ue00f'
          END = u'\ue010'
          HOME = u'\ue011'
          LEFT = u'\ue012'
          ARROW_LEFT = LEFT
          UP = u'\ue013'
          ARROW_UP = UP
          RIGHT = u'\ue014'
          ARROW_RIGHT = RIGHT
          DOWN = u'\ue015'
          ARROW_DOWN = DOWN
          INSERT = u'\ue016'
          DELETE = u'\ue017'
          SEMICOLON = u'\ue018'
          EQUALS = u'\ue019'
      
          NUMPAD0 = u'\ue01a'  # number pad keys
          NUMPAD1 = u'\ue01b'
          NUMPAD2 = u'\ue01c'
          NUMPAD3 = u'\ue01d'
          NUMPAD4 = u'\ue01e'
          NUMPAD5 = u'\ue01f'
          NUMPAD6 = u'\ue020'
          NUMPAD7 = u'\ue021'
          NUMPAD8 = u'\ue022'
          NUMPAD9 = u'\ue023'
          MULTIPLY = u'\ue024'
          ADD = u'\ue025'
          SEPARATOR = u'\ue026'
          SUBTRACT = u'\ue027'
          DECIMAL = u'\ue028'
          DIVIDE = u'\ue029'
      
          F1 = u'\ue031'  # function  keys
          F2 = u'\ue032'
          F3 = u'\ue033'
          F4 = u'\ue034'
          F5 = u'\ue035'
          F6 = u'\ue036'
          F7 = u'\ue037'
          F8 = u'\ue038'
          F9 = u'\ue039'
          F10 = u'\ue03a'
          F11 = u'\ue03b'
          F12 = u'\ue03c'
      
          META = u'\ue03d'
          COMMAND = u'\ue03d'

       使用Ctrl+鼠标左键查看模块的源代码,就可以看到键盘的使用方法

    • 方法的操作

      • 回车事件:send_keys(Keys.ENTER)

        '''模块跟库的导入'''
        from selenium import  webdriver
        from selenium.webdriver.common.keys import Keys
        import time as t
        
        driver=webdriver.Chrome() #打开测试需要的浏览器
        driver.maximize_window() #浏览器最大化
        driver.get('http://www.baidu.com')  #需要测试的页面
        so=driver.find_element_by_id('kw')  #定位到元素并定义为so
        t.sleep(3) #固定等待3秒
        so.send_keys('自动化测试') #输入‘自动化测试’
        t.sleep(3)#固定等待3秒
        so.send_keys(Keys.ENTER)#元素按回车
        t.sleep(3)#固定等待3秒
        driver.quit()#退出测试

        以百度首页输入框为例

      • 快捷键的使用

        • 复制
          send_keys(Keys.CONTROL,'c')
        • 粘贴
          send_keys(Keys.CONTROL,'v')
        • 剪切
          send_keys(Keys.CONTROL,'x')
        • 全选
          send_keys(Keys.CONTROL,'a')
        • 实战(以百度首页输入框为例)
          from selenium import  webdriver
          from selenium.webdriver.common.keys import Keys
          import time as t
          
          driver=webdriver.Chrome() #打开测试需要的浏览器
          driver.maximize_window() #浏览器最大化
          driver.get('http://www.baidu.com')  #需要测试的页面
          so=driver.find_element_by_id('kw')  #定位到元素并定义为so
          t.sleep(3)#固定等待3秒
          so.send_keys("自动化测试")
          t.sleep(3)#固定等待3秒
          so.send_keys(Keys.CONTROL,'a')#全选
          t.sleep(3)#固定等待3秒
          so.send_keys(Keys.CONTROL,'c')#复制
          so.send_keys(Keys.BACKSPACE)#删除
          t.sleep(3)#固定等待3秒
          so.send_keys("接口测试")#输入内容
          t.sleep(3)#固定等待3秒
          so.send_keys(Keys.CONTROL,'v')#粘贴
          t.sleep(3)#固定等待3秒
          so.send_keys(Keys.ENTER)#回车
          t.sleep(3)#固定等待3秒
          driver.quit()#退出测试
  • JavaScript

    • 浏览器的滑动

      浏览器的滑动主要分为浏览器的向上和向下,比如我们就以百度搜索引擎为案例,我们进行关键字的搜索后,想点几下一步操作,但是下一步无法展示出来,就需要把页面滑动到底部才可以展示出来

       测试代码如下:

      from selenium import webdriver
      import time as t
      
      driver=webdriver.Chrome()#定义测试需要的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('http://www.baidu.com')#测试需要的页面
      driver.implicitly_wait(30)#隐式等待30秒
      t.sleep(3)#固定等待3秒
      driver.find_element_by_id('kw').send_keys("测试开发")#定位到元素并输入
      driver.find_element_by_id('su').click()#定位到元素并点击
      t.sleep(3)#固定等待3秒
      down='var q=document.documentElement.scrollTop=10000'  #定义JavaScript
      driver.execute_script(down) #执行JavaScript
      t.sleep(3)#固定等待3秒
      driver.find_element_by_xpath('//*[@id="page"]/div/a[10]').click()#点击下一页
      t.sleep(3)#固定等待3秒
      driver.execute_script(down)#执行JavaScript
      t.sleep(3)#固定等待3秒
      up='var q=document.documentElement.scrollTop=0'#定义JavaScript
      t.sleep(3)#固定等待3秒
      driver.execute_script(up)#执行JavaScript
      driver.quit()#退出测试
    • 富文本的处理

      现在互联网的产品基本都会使用到富文本的信息,针对富文本的特性,其实我们有两个思路来实现元素的定位方式,一种是iframe的思路,另外一种是JS的方式。

       查看源代码:

       iframe测代码如下:

      from selenium import webdriver#模块的导入
      import time as t#导入库
      
      driver=webdriver.Chrome()#定义测试的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('https://uutool.cn/ueditor/')#测试的页面
      driver.implicitly_wait(20)#隐式等待20秒
      t.sleep(3)#固定等待3秒
      driver.switch_to.frame('ueditor_0')#进入到iframe框架
      t.sleep(3)#固定等待3秒
      driver.find_element_by_xpath('/html/body/p').send_keys('测试开发工程师')#定位元素并输入内容
      t.sleep(3)#固定等待3秒
      driver.quit()#退出测试

      Js测试代码如下:

      from selenium import webdriver#模块的导入
      import time as t#导入库
      
      def richText(driver,content):
          '''
          实现在富文本里面输入内容:param 
          driver:webdriver实例化后的对象信息:param 
          content:富文本里面需要输入的文字内容:return:
          '''
          js="document.getElementById('ueditor_0').contentWindow.document.body.innerHTML='{0}'".format(content)
          driver.execute_script(js)
      
      driver=webdriver.Chrome()#定义测试的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('https://uutool.cn/ueditor/')#测试的页面
      driver.implicitly_wait(20)#隐式等待
      t.sleep(3)#固定等待3秒
      richText(driver=driver,content="我使用了Js来进行处理") #函数的调用
      t.sleep(3)#固定等待3秒
      driver.quit()#退出测试
    • 时间控件的处理

      在如上的代码中可以很清晰的看到它是只读属性,那么我们需要填写时间的属性,具体解决问题的步骤为:
      
      1.取消时间控件的只读属性
      2.取消只读属性后,操作input控件的value,其实我们知道input里面输入的内容最终是在value的属性里面。

      测试代码如下:

      from selenium import  webdriver#模块的导入
      import  time as t#库的导入
      
      def startTime(driver,content):
          '''开始时间控件'''
          js="$(\"input[placeholder='开始时间≥当前时间']\").removeAttr('readonly');" \
             "$(\"input[placeholder='开始时间≥当前时间']\").attr('value','{0}')".format(content)
          driver.execute_script(js)
      
      def endTime(driver,content):
          '''结束时间控件'''
          js="$(\"input[placeholder='结束时间>开始时间']\").removeAttr('readonly');" \
             "$(\"input[placeholder='结束时间>开始时间']\").attr('value','{0}')".format(content)
          driver.execute_script(js)
      
      driver=webdriver.Chrome()#定义需要测试的浏览器
      driver.maximize_window()#浏览器最大化
      driver.get('file:///F:/UI%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/Time/index.html')#测试的页面
      driver.implicitly_wait(20)#隐式等待
      t.sleep(3)#固定等待3秒
      startTime(driver,"2021-12-05 00:00:00")#调用开始时间控件
      t.sleep(3)#固定等待3秒
      endTime(driver,"2021-12-06 00:00:00")#调用结束时间控件
      t.sleep(3)#固定等待3秒
      driver.quit()#退出测试

       


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM