自动化测试框架搭建-配置-1
先從一個腳本test_baidu.py開始,目的是模擬在Chrome瀏覽器的百度界面上搜索一個關鍵字“自動化測試unittest”.在線安裝selenium這里自不必說,通過 pip install selenuim 進行在線安裝
#coding:utf-8import os import time from selenium import webdriver from selenium.webdriver.common.by import ByURL = "http://www.baidu.com" base_path = os.path.abspath(os.path.abspath(__file__)+'\...') driver_path = os.path.abspath(base_path + '\drivers\chromedriver.exe')locator_kw = (By.ID,'kw') locator_su = (By.ID,'su') locator_result = (By.XPATH,'//div[contains(@class, "result")]/h3/a')driver = webdriver.Chrome(executable_path=driver_path) driver.get(URL)driver.find_element(*locator_kw).send_keys("自動化測試unitest") driver.find_element(*locator_su).click() time.sleep(2) links = driver.find_element(*locator_result) for link in links:print (link.text) driver.quit()提示:Message:'Chromedriver.exe' executable needs to be in PATH.
將該驅動加入到環境變量PATH中
發現該問題沒有解決,將chromedriver.exe拷貝至當前工作目錄,這里的工作目錄是
此時不在彈出path路徑沒有引用的問題,在打開瀏覽器時提示:請停用以開發者模式運行的擴展程序:
? ? 出現這樣的對話框,如果不能自動關閉,這個對話框會影響web端頁面的其他鏈接的定位識別,這樣就會導致該腳本就沒法正常完成。?想過多種方法,如何關閉開發者模式等方法,在本地的時候,已經手動關閉了開發者模式,但是在運行腳本的過程中,該對話框一直存在。最后無解,在處理腳本過程中,為了規避這個對話框,我采取的方法是,在輸入URL后,就將打開的頁面設置最大化,即在適當的位置輸入 driver.maximize_window() ,但是這樣的方法只是暫時規避了,在運行腳本的過程中,該對話框是一直存在的。 最后發現是版本不一致的原因。簡單來說,更新Chromedriver.exe與Chrome瀏覽器版本保持一致。
chromedriver下載
如果版本chrome版本較新,可能找不到對應的關系,但是稍微推理下就不難發現,從chromedriver的V2.*版本和支持的Chrome版本的邏輯對應關系,就不難找到自己chrome版本的chromedriver版本,如自己的chrome版本為:
自然對應的chromedriver版本為V2.37版本,支持的chrome版本為66-68,下載之后放在當前工作目錄(和test_baidu.py同一目錄)下,就可以解決上述問題。
URL = "http://www.baidu.com" #base_path = os.path.abspath(os.path.abspath(__file__)+'\...') #driver_path = os.path.abspath(base_path + '\drivers\chromedriver.exe') driver_path = os.path.abspath('chromedriver.exe')locator_kw = (By.ID,'kw') locator_su = (By.ID,'su') locator_result = (By.XPATH,'//div[contains(@class, "result")]/h3/a')driver = webdriver.Chrome(executable_path=driver_path) driver.maximize_window() driver.get(URL)搜索框中定位了kw元素,“百度一下”按鈕定位了 su 元素,如下圖所示:
運行腳本發現百度搜索界面可以正常彈出,但是沒有在搜索框中搜索“自動化測試unittest”,盡管開始加了coding:utf-8,但是還有有懷疑是否不支持中文,去掉中文“自動化測試”進行試驗
driver.find_element(*locator_kw).send_keys("unittest")可以正常搜索,但是為什么不能鍵入中文呢?還請指教
? ? ? ?但是為了搭建一個將數據和測試用例分離的輕量級測試框架,需要做的是將驅動放置在drivers下,而不是放置在當前目錄(將chromedriver.exe和test_baidu.py放置在同一目錄)下,將chromedriver.exe放置到新建的driver目錄下,將上述獲取chromedriver.exe的路徑進行修改 。??
#coding:utf-8import os import time from selenium import webdriver from selenium.webdriver.common.by import ByURL = "http://www.baidu.com" #base_path = os.path.abspath(os.path.abspath(__file__)+'\...') #driver_path = os.path.abspath(base_path + '\drivers\chromedriver.exe') #driver_path = os.path.abspath('chromedriver.exe')DirPath = os.path.dirname(os.path.dirname(__file__)) #print DirPath driver_path = os.path.join(DirPath, '../drivers/chromedriver.exe')#這里也可以去掉"../" #print driver_pathlocator_kw = (By.ID,'kw') locator_su = (By.ID,'su') locator_result = (By.XPATH,'//div[contains(@class, "result")]/h3/a')driver = webdriver.Chrome(executable_path=driver_path) driver.maximize_window() driver.get(URL)driver.find_element(*locator_kw).send_keys("unittest") driver.find_element(*locator_su).click() #driver.find_element(*locator_wd).click() time.sleep(2) links = driver.find_element(*locator_result) for link in links:print (link.text) driver.quit()? ? ?模塊中在路徑訪問上,最初使用了絕對路徑進行訪問,但是絕對路徑訪問時存在問題,因為通過abspath()獲取的是..xx\xx\xx..行的window下的路徑,從而使得python在使用的時候很不方便,容易出現The file is not exist的錯誤,因此這里改用dirname()方法結合使用os.path.join()方法獲得路徑,對于其中的用法參考python路徑問題。這樣就實現了各個模塊的分離。對于其中使用XPath進行元素定位的方法,可以參考XPath詳解。對于只搜索一次,使用函數的方法也可以,但是selenium的強大之處就在于自動操作瀏覽器來做很多事情,它可以模擬我們與瀏覽器的交互,因此如果想要搜索“Python”,是不是要再創建一個腳本?還是把原來的腳本修改一下?或者我們可以用 unittest 來改一下,實現類的方法,把兩次搜索分別寫一個測試方法test_baidu1.py:
#coding:utf-8 #test_baidu1.py import os import time import unittest from selenium import webdriver from selenium.webdriver.common.by import Byclass TestBaiDu(unittest.TestCase):URL = "http://www.baidu.com"#driver_path = os.path.abspath('chromedriver.exe')DirPath = os.path.dirname(os.path.dirname(__file__))driver_path = os.path.join(DirPath, '../drivers/chromedriver.exe') #這里也可以去掉"../"locator_kw = (By.ID, 'kw')locator_su = (By.ID, 'su')locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')def setUp(self):self.driver = webdriver.Chrome(executable_path=self.driver_path)self.driver.get(self.URL)self.driver.maximize_window()def tearDown(self):self.driver.quit()def test_search_0(self):self.driver.find_element(*self.locator_kw).send_keys('unittest')self.driver.find_element(*self.locator_su).click()time.sleep(2)links = self.driver.find_elements(*self.locator_result)for link in links:print(link.text)def test_search_1(self):self.driver.find_element(*self.locator_kw).send_keys('Python')self.driver.find_element(*self.locator_su).click()time.sleep(2)links = self.driver.find_elements(*self.locator_result)for link in links:print(link.text)if __name__ == '__main__':unittest.main()顯示的過程為:首先打開chrome瀏覽器的百度搜索框,并開始搜索“unittest”;接著關閉該界面,再次打開chrome的百度搜索頁面,搜索“python”關鍵字,最后關閉。
打印的輸出結果:
? ? ? 現在讓搜索的目標數據和搜索的實現類進行分離,這樣避免了多次在源代碼上操作,如果需要修改搜索的地址,只需要在“配置”文件中進行修改。將配置抽出來放到config.yml中:
在工程framework下新建一個package,命名為config,并在config下新建一個config.yaml文件,由于無法直接通過右鍵/新建的形式直接建立yaml文件,可以在本地package下新建一個txt文件,再修改文件后綴為.yaml,編輯的時候使用notepad打開即可
按照搭建測試框架目錄中的結構,為了讀取yaml文件,我們需要一個封裝YamlReader類,在utils(公共方法)中創建file_reader.py文件,同樣新建一個utils的package,并創建file_reader.py腳本:
#coding:utf-8 import yaml import osclass YamlReader():def __init__(self, yamlf):if os.path.exists(yamlf):self.yamlf = yamlfelse:raise FileNotFoundError('文件不存在!')self._data = None@propertydef data(self):# 如果是第一次調用data,讀取yaml文檔,否則直接返回之前保存的數據if not self._data:with open(self.yamlf, 'rb') as f:self._data = list(yaml.safe_load_all(f)) # load后是個generator,用list組織成列表return self._data對于如何使用@property可以參考學習@property,而且我們需要一個Config類來讀取配置,將該模塊放置在config這package種,因此config.py:
#coding:utf-8 """ 讀取配置。這里配置文件用的yaml,也可用其他如XML,INI等,需在file_reader中添加相應的Reader進行處理。 """ import os from utils.file_reader import YamlReader# 通過當前文件的絕對路徑,其父級目錄一定是框架的base目錄,然后確定各層的絕對路徑。如果你的結構不同,可自行修改。 # 之前直接拼接的路徑,修改了一下,用現在下面這種方法,可以支持linux和windows等不同的平臺,也建議大家多用os.path.split() # 和os.path.join(),不要直接+'\\xxx\\ss'這樣 BASE_PATH = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0] CONFIG_FILE = os.path.join(BASE_PATH, 'config', 'config.yml') DATA_PATH = os.path.join(BASE_PATH, 'data') DRIVER_PATH = os.path.join(BASE_PATH, 'drivers') LOG_PATH = os.path.join(BASE_PATH, 'log') REPORT_PATH = os.path.join(BASE_PATH, 'report')class Config:def __init__(self, config=CONFIG_FILE):self.config = YamlReader(config).datadef get(self, element, index=0):"""yaml是可以通過'---'分節的。用YamlReader讀取返回的是一個list,第一項是默認的節,如果有多個節,可以傳入index來獲取。這樣我們其實可以把框架相關的配置放在默認節,其他的關于項目的配置放在其他節中。可以在框架中實現多個項目的測試。"""return self.config[index].get(element)但是運行的時候,提示沒有模塊No Module named file_reader
修改加載file_reader模塊的路徑,這里工程名字叫Franmework為,從根一級路徑開始加載路徑:
from Framework.utils.file_reader import YamlReader對于此處可能出現:The file is not exits!
需要將絕對路徑更改為相對路徑,關于使用路徑的問題可以參考python中路徑獲取。以CONFIG_FILE為例:
BASE_PATH = os.path.dirname(os.path.dirname(__file__)) CONFIG_FILE = os.path.join(BASE_PATH, 'config/config.yaml')再次修改test_baidu2.py腳本:
#coding:utf-8 import time import unittest from selenium import webdriver from selenium.webdriver.common.by import By from utils.config import Config, DRIVER_PATHclass TestBaiDu(unittest.TestCase):URL = Config().get('URL')locator_kw = (By.ID, 'kw')locator_su = (By.ID, 'su')locator_result = (By.XPATH, '//div[contains(@class, "result")]/h3/a')def setUp(self):self.driver = webdriver.Chrome(executable_path=DRIVER_PATH + '\chromedriver.exe')self.driver.get(self.URL)def tearDown(self):self.driver.quit()def test_search_0(self):self.driver.find_element(*self.locator_kw).send_keys('selenium')self.driver.find_element(*self.locator_su).click()time.sleep(2)links = self.driver.find_elements(*self.locator_result)for link in links:print(link.text)def test_search_1(self):self.driver.find_element(*self.locator_kw).send_keys('Python selenium')self.driver.find_element(*self.locator_su).click()time.sleep(2)links = self.driver.find_elements(*self.locator_result)for link in links:print(link.text)if __name__ == '__main__':unittest.main()因此測試框架為:
總結
以上是生活随笔為你收集整理的自动化测试框架搭建-配置-1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unittest+discover批量处
- 下一篇: 自动化测试框架搭建-日志-2