第五章 常用頁面元素自動化操作

      經過我們對自動化測試環境的搭建,頁面元素的定位,測試點的驗證以及自動化測試用例的初探等的學習,可以說我們可以編寫自動化測試用例了。本章節我們將對常用的頁面元素的自動化操作,作一下詳細的介紹,以便大家在以後編寫自動化測試用例的時候更加得心應手。

5.1 輸入類元素

   現在很多網站都實行會員制或是實名制的,所以註冊和登錄是非常常見的操作,在一個網站上輸入各種信息也是必不可少的,我們首先講解輸入類元素。

5.1.1 inputtextarea元素

   這兩個是最常見的操作,這是的input的type爲text和password類型,不是上傳圖片的,上圖片我們下節再講。對於這類輸入文本的元素操作對於python是一種操作,先對元素進行定位,然後調用send_keys()函數,進行輸入。

例:

definputvalue(self,findby,elmethod,value):

        '''

        通過定製定位方法,在輸入框中輸入值

        @param findby: 定位方法,如:byid,byname,byclassname,byxpath等

        @param elmethod: 要定位元素的屬性值 ,如:id,name,class name,xpath等

        @param value: 要給文本框輸入的值

        '''

        if(findby == 'byid'):

            self.driver.find_element_by_id(elmethod).send_keys(value)

        elif(findby == 'byname'):

            self.driver.find_element_by_name(elmethod).send_keys(value)

        elif(findby =='byclassname'):

            self.driver.find_element_by_class_name(elmethod).send_keys(value)

        elif(findby == 'byxpath'):

self.driver.find_element_by_xpath(elmethod).send_keys(value)

     這個inputvalue函數就是我對這類操作函數進行的封裝,根據不同的定位類型,先對要輸入的元素進行操作,然後send_keys(value)將關鍵字輸入進去。

注:有些兒網站在輸入框失去焦點後不會清除裏面默認的字符,爲了確保輸入正確,我們在定位到元素後先調用clear()函數,將默認的字符清除後再進行輸入操作。

5.1.2 input上傳文件

   inputtypefile時,說明這個元素是上傳文件的,這個時候我們的普通操作是,單擊這個元素,然後在彈出的上傳文件對話框中選擇要上傳的文件,最後是單擊上傳按鈕。

而在我們寫自動化測試的時候,如果按這個步驟操作的話,會非常麻煩,因爲我們無法定位彈出的上傳文件對話框,要藉助於第三方工具。其實沒有必要這麼麻煩,我們可以按照上面的上傳文字的方法,不過參數不是文件,是文件路徑,這樣就能上傳了。

例:

        self. Driver.find_element_by_xpath (location).send_keys(filepath);

這個例子是用id來定位的,然後把文件路徑作爲參數傳給這個元素。

注:這個文件路徑最好是相對路徑,將文件和代碼放到一起,這樣在代碼放到其他的地方運行的時候,就不會出現找不到需要上傳文件的現象了。

5.1.3 特殊按鍵的輸入

   在輸入過程中,有的時候我們需要輸入特殊的按鍵,可是組合鍵。如按ESC或是CTRL+A等,這些兒我們無法用鍵盤輸入的鍵,應該如何輸入呢?

   其實和普通的字符輸入差不多,不過需要調用特殊的類Key,例如:

1)執行按ESC鍵操作

         self.driver.find_element_by_name ('image_file').send_keys(Keys.ESCAPE)

2)執行按CTRL+a鍵操作

        self.driver.find_element_by_name ('image_file').send_keys((Keys.CONTROL,'a'))

   當然對元素的輸入操作這些兒是常見的,也有不常見的,如果遇到,可以酌情處理,多嘗試幾種方法。

5.2 單擊類元素

   好像自從鼠標出現後,用鼠標完成的操作越來越多了,在我們自動化測試過程中,單擊類操作是必不可少的操作之一。下面我們來看一下單擊類操作的自動化測試代碼:

5.2.1 按鈕類元素單擊

   在頁面上單擊按鈕用來完成特定的操作,比較登錄,註冊,提交等。方法是,先定位到這個元素,然後調用click()函數。

例如:

def clickitem(self,findby,elmethod):

        '''

        通過定製定位方法,在對應的項目上執行單擊操作

        @param findby: 定位方法,如:byid,byname,byclassname,byxpath等

        @param elmethod: 要定位元素的屬性值,如:id,name,class name,xpath,text等

        '''

        if(findby == 'byid'):

            self.driver.find_element_by_id(elmethod).click()

        elif(findby == 'byname'):

            self.driver.find_element_by_name(elmethod).click()

        elif(findby == 'byxpath'):

            self.driver.find_element_by_xpath(elmethod).click()

        elif(findby == 'bytext'):

            self.driver.find_element_by_text(elmethod).click()

        elif(findby == 'byclassname'):

self.driver.find_element_by_class_name(elmethod).click()

函數clickitem()通過各種定位方法,先將要定位的元素定位,然後執行click()操作。

5.2.2 超級鏈接單擊操作

   在網站上單擊超級鏈接,從而執行相應的操作。可以像按鈕一樣,先定位到這個超級鏈接,然後執行click()函數。但是針對超級鏈接,有專門的定位方法 :

       driver.find_element_by_link_text(link_text).click()

       driver.find_element_by_partial_link_text(link_text).click()

  將超級鏈接全部文字或是部分文字用來定位,然後調用click()函數,就可以完成單擊操作。

5.2.3 鼠標右擊和雙擊操作

   雖然在測試過程中,對被測試元素進行右擊和雙擊操作不太常用,可是這兩個操作還是很有用的。對於不太常用的操作,webdriver就沒有將這個操作封裝到Element類中,而是在ActionChains 類中。以下用例參考了蟲師的博客(http://www.cnblogs.com/fnng/p/3288444.html,他的博客寫的相當好,建議去學習一下。)

引用ActionChains類:

   from selenium.webdriver.common.action_chains import ActionChains

(1)右擊操作:

chain = ActionChains(driver)

implement = driver.find_element_by_xpath(“location”)

chain.context_click(implement).perform()

(3)雙擊操作:

qqq =driver.find_element_by_xpath("location")
#對定位到的元素執行鼠標雙擊操作 
ActionChains(driver).double_click(qqq).perform()

   對於其他的鼠標操作,請參考我們推薦的博客,自行學習,我們本章只講常用的操作。 

5.3 選擇類元素

   在網站創建過一再要求操作要簡單化,爲了減少用戶操作,就會提供很多選擇類的操作,如超級鏈接類品牌選擇,單選類操作,複選類操作,下拉菜單類選擇操作等。這類操作有的是簡單的單擊一下,有的需要調用相應的函數,所以我們下面詳細講述一下。

5.3.1 超級鏈接類選擇

   超級鏈接類選擇往往出現在購物網站上,如京東,淘寶等。這類型的選擇其實沒有什麼特殊的,可以採用上面提到的超級連接定位法,普通的定位,單擊要選擇的分類即可。

   此時注意,不同分類的選擇,有可能顯示結果的地方是新頁面,或是iframe,此時要檢測搜索的結果,就要先切換到新頁面或是iframe當中。

5.3.2 單選框選擇

   在填寫信息的時候,經常會遇到性別選擇,或是其他類型的單選按鈕的選擇。其實單選框如同普通元素,先對其進行定位,然後執行click()操作。

例如:

     sexelem=driver.find_element_by_xpath(“sex”)

    sexelem.click()

  執行了操作後,定位的單選按鈕就處於選中狀態了。如果不想選中 個單選按鈕,可以單擊其他的單選項,或是招待clear()函數,就取消選中。判斷單選按鈕是否處於選中狀態,可以調用函數isSelected().

注:有的單選按鈕的選擇圓圈和顯示文字可以分開定位,此時單擊哪一個都可以,要考慮哪兒個方便定位。

5.3.3 複選框選擇

  爲了增加用戶體驗,給用戶提供更多的選擇,複選框的應用也是非常多的。複選框的使用是很簡單的,定位到相應的複選框,然後單擊。例如:

     pricelem=driver.find_element_by_xpath(“price”)

     pricelem.click()

   複選框的操作和單選框差不多,想取消選擇,可以調用clear()函數,也可以再次單擊就可以取消選擇。判斷是否選中,調用函數isSelected()。判斷是否可用,調用函數isEnabled()

5.3.4 下拉菜單類選擇

   在填寫信息的時候,城市的選擇;可是對頁面信息的選擇,都會用到下拉菜單。在webdriver+python中,對應的是Select類,如:

     from selenium.webdriver.support.uiimport Select

   我們要操作下拉菜單,先用普通元素的定位方法,定位到這個元素,然後轉化爲select類型的。

    select =Select(self.driver.find_element_by_id(“selected”))

  接下來調用select_by_visible_text()函數來選擇對應的菜單項。

例:select.select_by_visible_text(“北京”)

java版的webdriver還有其他的相應操作,不過python好像只有這一個操作。對於下拉菜單,還可以像普通元素一樣,先單擊下拉菜單,拉出菜單項,然後單擊對應的選擇項。不過這樣操作時而好用,時而不好用,不建議用這種方法,此處只提供一種參考。

5.4 獲取元素的文本

   在設置檢測點的時候,我們經常需要獲取操作後影響到頁面元素,然後和預期的相比。所以此時用到最多的就是獲取元素的文本,與預期的相比,相同則說明測試通過。

   獲取元素文本的方法,不管你是div,link,或是其他的元素,都是一樣的。先定位到這個元素,然後獲取text屬性。例如:

def gettext(self,findby,elmethod):

        '''

        通過定製定位方法,獲取指定元素的文本

        @param findby: 定位方法,如:byid,byname,byxpath等

        @param elmethod: 要定位元素的屬性值,如:id,name,xpath等

        @return: 返回獲取到的元素文本

        '''

        if(findby == 'byid'):

            return self.driver.find_element_by_id(elmethod).text

        elif(findby == 'byname'):

            return self.driver.find_element_by_name(elmethod).text

        elif(findby == 'byxpath'):

            return self.driver.find_element_by_xpath(elmethod).text

        elif (findby=='byclassname'):

            return self.driver.find_element_by_class_name(elmethod).text

        elif (findby=='bycss'):

return self.driver.find_element_by_css(elmethod).text

gettext()函數通過各種定位方法,定位到要獲取text的元素,然後將text返回。

 

5.5 頁面或iframe切換

  在自動化測試過程中,難免會遇到,打開新頁面或是切換到新的iframe中的情況。如果我們不將代碼做相應的切換操作,將句柄切到新的頁面或是iframe中,我們定位的時候,將出現找不到元素的情況。所以,在適當的時候切換一下句柄,然後再進行測試操作。

5.3.1 頁面間的切換

    在網頁中單擊鏈接打開新網頁,然後在新打開的頁面中操作或是驗證新頁面中操作的結果等操作。如果我們用Selenium IDE錄製腳本的時候,回放或是調試代碼,執行到打開新頁面後就會提示元素找不到。可是我們用Selenium IDE驗證的時候,能找到要定位的元素,這是什麼原因啊?

其實就是當前的driver句柄在第一次打開頁面的時候,取的是頁面句柄,但是當我們打開新頁面後,句柄還是原來的頁面的。在原來的頁面上查找新頁面的元素,當然會找不到了。所以在我們驗證新頁面的元素的時候,需要先調用switch_to_window(0將句柄切換到新打開的頁面。

例如:

      self.driver.switch_to_window(self.driver.window_handles[-1])

self.driver.window_handles爲獲取所有打開窗口的句柄,-1爲獲取最後一個窗口的句柄,即最新打開的窗口的句柄。

 

5.3.2 iframe間的切換

   iframe間的切換在正常的頁面中偶爾會遇到,如果要自動化測試後臺相關的內容,則iframe是非常多的。幾乎所有的操作都要在不同的iframe之間進行切換,本節我們只講一種方法,更多的方法請參考:http://blog.sina.com.cn/s/blog_68f262210101mcxp.html

   例如現在頁面上有兩個iframe,一個name屬性爲“frame1”,另一個name屬性爲“frame2”,我們現在需要將句柄切換到frame2中:

      this.driver.switchTo().frame("frame2);

   注:切換過iframe後,就可以在這個裏面定位元素或是執行操作了。有的時候如果程序招待太快,可能會出現句柄切換不成功的現象,此時在切換句柄語句後,添加等待操作,然後再去查找就可以成功了。

5.4 本章小節

       本章我們講述了自動化測試中最常見的元素操作,就像我們在蓋高樓大廈之前的磚,水泥和鋼筋。雖然這隻有這些兒東西,我們不能建起我們的大廈,可是這也是先決條件。必須掌握的東西,本章節我們沒有列出所有的元素,因爲網站應用的時候非常靈活,我們只講基本的,對於不常用的,請自行學習。第六章,我們將着手繪製建築藍圖,講解自動化測試的實施及測試框架的搭建。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章