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