🔥《手把手教你》系列練習篇之 5-python+ selenium 自動化測試(詳細教程)

北京-宏哥發表於2024-11-20

1.簡介

  相信各位小夥伴或者同學們透過前面已經介紹了的 Python+Selenium 基礎篇,透過前面幾篇文章的介紹和練習,Selenium+Python 的 webUI 自動化測試算是 一隻腳已經邁入這個門檻了要想第二隻腳也邁進來。那麼就要繼續跟隨宏哥的腳步繼續前行。接下來,宏哥

計劃寫第二個系列:練習篇,透過一些練習,瞭解和掌握一些 Selenium 常用的介面或者方法。同時也可以把各位小夥伴或者童鞋們的基礎夯實一下、鞏固一下。這樣有助於小夥伴或者同學們更快的將自己在門外的第二隻腳邁進來,加入自動化測試的隊伍中。

  本文透過練習三個知識點:正則提取關鍵字、ID 和 tag name 定位 web 頁面元素。

2. 練習場景:

  例如:在某一個網頁上有些欄位或者關鍵字等資訊是我們感興趣的,我們希望將其摘取出來,進行其他操作。但是這些欄位可能在一個網頁的不同地方。例如,我們需要在關於百度頁面 - 聯絡我們,摘取全部的郵箱。

3. 思路拆分:

  1. 首先,需要得到當前頁面的 source 內容,就像,開啟一個頁面,右鍵 - 檢視頁面原始碼。
  2. 找出規律,透過正規表示式去摘取匹配的欄位,儲存到一個字典或者列表。
  3. 迴圈列印字典或列表中內容,Python 中用 for 語句實現。

4.技術角度實現相關方法:

  1. 檢視頁面的原始碼,在 Selenium 中有 driver.page_source 這個方法得到
  2. Python 中利用正則,需要匯入 re 模組
  3. 將欄位透過下列程式碼列印出來
for email in emails :

          print email

4.1 程式碼實現

想法技術角度方法都找到,我們新建一個 extract_email.py 檔案,輸入如下程式碼:

4.2 參考程式碼:

# coding=utf-8🔥

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-11-28
@author: 北京-宏哥   QQ交流群:705269076
Project: python+ selenium自動化測試練習篇
'''

# 3.匯入模組
from selenium import webdriver
import re

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)

driver.get("http://home.baidu.com/contact.html")
# 得到頁面原始碼
doc = driver.page_source
emails = re.findall(r'[\w]+@[\w\.-]+', doc)  # 利用正則,找出 xxx@xxx.xxx 的欄位,儲存到emails列表
# 迴圈列印匹配的郵箱
for email in emails:
    print(email)

4.3 解釋說明:

在 python 正規表示式語法中,Python 中字串前面加上 r 表示原生字串,用\w 表示匹配字母數字及下劃線。re 模組下 findall 方法返回的是一個匹配子字串的列表。

4.4 執行結果:

執行程式碼後,控制檯列印如下圖的結果

5.利用 ID 定位元素

  在上邊,我們介紹瞭如何摘取頁面欄位,透過正則進行匹配符合要求的欄位。如果感覺有點困難,不能立馬理解,沒有關係。把字串摘取放到第一篇,是因為自動化測試指令碼,經常要利用字串操作,字串切割,查詢,匹配等手段,得到新的字串或字串陣列,然後根據新得到的字串進行判斷用例是否透過。

下面介紹如何透過元素節點資訊ID來定位該元素,使用id來定位元素雖然效率要高於XPath,但是實際測試測專案,能直接透過id定位的元素還是比較少,以下來舉例百度首頁搜尋輸入框的id定位。

5.1 程式碼實現

我們新建一個 test_baidu_id.py 檔案,輸入如下程式碼:

5.2 參考程式碼

# coding=utf-8🔥

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-11-28
@author: 北京-宏哥   QQ交流群:705269076
Project: python+ selenium自動化測試練習篇
'''

# 3.匯入模組
from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)

driver.get("https://image.baidu.com/search/down?url=https://www.baidu.com")
try:
    driver.find_element_by_id("kw")
    print ('test pass: ID found')
except Exception as e:
    print ("Exception found", format(e))

driver.quit()

這裡,我們透過 try except 語句塊來進行測試斷言,這個在實際自動化測試指令碼開發中,經常要用到處理異常。本文,我們學習了可以利用 find_element_by_id()方法來定位網頁元素物件。

5.3 執行結果:

執行程式碼後,控制檯列印如下圖的結果

6. 利用 tag name 定位元素

前邊介紹瞭如何透過元素的 id 值來定位 web 元素,本文介紹如何透過 tag name 來定位元素。個人認為,透過 tag name 來定位還是有很大缺陷,定位不夠精確。主要是 tag name 有很多重複的,造成了選擇 tag name 來定位頁面元素不準確,所以使用這個方法定位 web 元素的機會很少。

什麼是tag name? 還是以百度首頁搜尋輸入框,在火狐瀏覽器,右鍵,透過firepath,檢查元素,看下圖:

上面圖片中紅色圈選區域的標籤名稱都是tag name;實際上我們目標元素是輸入框,應該是input這個tag name,在圖中藍色高亮區域。但是如果只是透過input這個tag name來定位,發現上面有很多input的選項。所以我們擴大節點的參照選擇,我們選擇上面這個

form 來作為我們 tag name。

6.1 程式碼實現

看看如何寫定位 form 這個元素的指令碼:

6.2 參考程式碼

# coding=utf-8🔥

# 1.先設定編碼,utf-8可支援中英文,如上,一般放在第一行

# 2.註釋:包括記錄建立時間,建立人,專案名稱。
'''
Created on 2019-11-28
@author: 北京-宏哥   QQ交流群:705269076
Project: python+ selenium自動化測試練習篇
'''

# 3.匯入模組
from selenium import webdriver

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)

driver.get("https://image.baidu.com/search/down?url=https://www.baidu.com")
try:
    driver.find_element_by_tag_name("form")
    print ('test pass: tag name found')
except Exception as e:
    print ("Exception found", format(e))

driver.quit()

6.3 執行結果:

執行程式碼後,控制檯列印如下圖的結果

7. 小結

總結:本文介紹了 webdriver 八大定位元素方法中的 driver.find_element_by_tag_name("form") # form 是 tag name 從實際專案中自動化指令碼開發來看,使用這個方法定位元素的機會比較少,知道有這麼一種方法就好了。

相關文章