- 指定保存日誌的文件路徑,日誌級別,以及調用文件
- 將日誌存入到指定的文件中
- :param logger:
- """
- # 創建一個logger
- self.logger = logging.getLogger(logger)
- self.logger.setLevel(logging.DEBUG)
- # 創建一個handler,用於寫入日誌文件
- rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
- log_path = os.path.dirname(os.getcwd()) + '/Logs/'
- log_name = log_path + rq + '.log'
- fh = logging.FileHandler(log_name)
- fh.setLevel(logging.INFO)
- # 再創建一個handler,用於輸出到控制檯
- ch = logging.StreamHandler()
- ch.setLevel(logging.INFO)
- # 定義handler的輸出格式
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
- fh.setFormatter(formatter)
- ch.setFormatter(formatter)
- # 給logger添加handler
- self.logger.addHandler(fh)
- self.logger.addHandler(ch)
selenium + python 自動化測試
環境搭建
1.python下載地址
根據自己的操作系統32/64 位,選擇相應的版本。
2.配置環境變量
修改我的電腦->屬性->高級->環境變量->系統變量中的PATH爲:
變量名:PATH
變量值:;C:\Python35;C:\Python35\Scripts;
3、安裝selenium
3.1、通過pip 安裝
C:\Users\fnngj>python3 -m pip install selenium
3.2、通過下載包安裝
或者直接下載selenium包:
解壓,cmd進入目錄:
C:\selenium\selenium2.53.5> python3 setup.py install
三. 安裝三大瀏覽器驅動driver
1.chromedriver 下載地址:https://code.google.com/p/chromedriver/downloads/list
2.Firefox的驅動geckodriver 下載地址:https://github.com/mozilla/geckodriver/releases/
3.IE的驅動IEdriver 下載地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
geckodriver
這是因爲在Firefox高版本需要使用 geckodriver 來驅動,
不再使用Seleniu默認自帶的Firefox webdriver。
python -m pip install PyMySQL
表示chrome瀏覽器版本爲54.0.2840.99,但是chromedriver版本爲2.9.248315。版本不兼容
網上找了遇到相同問題的解決辦法 http://blog.csdn.net/u012246342/article/details/52860949
下載v2.24版本的chromedriver.exe替換原有的chromedriver.exe(下載地址: http://chromedriver.storage.googleapis.com/index.html?path=2.24/
)
重新運行腳本,第一次運行較慢,最終超時失敗,第二次運行成功!!
初級
from selenium import webdriver # 導入webdriver包
driver = webdriver.Firefox() # 初始化一個火狐瀏覽器實例:driver
driver = webdriver.Chrome()
driver = webdriver.Ie()
driver.maximize_window() # 最大化瀏覽器
driver.implicitly_wait(8) # 設置隱式時間等待
driver.maximize_window() # 最大化瀏覽器
driver.get("https://www.baidu.com") # 通過get()方法,打開一個url站點
driver.quit() #關閉並退出瀏覽器
xpath
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium") # 搜索輸入框輸入Selenium
driver.find_element_by_xpath("//*[@id='su']").click() #點擊百度一下按鈕
driver.find_element_by_id("kw")
driver.find_element_by_tag_name("form")
driver.find_element_by_link_text("新聞")
driver.find_element_by_partial_link_text("主頁").click()
driver.find_element_by_class_name("s_ipt")
driver.find_element_by_name("wd")
driver.find_element_by_css_selector("#su")
driver.find_element_by_id("kw").send_keys("Selenium")
driver.find_element_by_id("kw").clear()
driver.refresh()
elem_news.click()
driver.back()
driver.forward()
driver.capabilities['version']
driver.current_url
driver.title
time.sleep(1)
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') # 觸發ctrl + t
for i in driver.find_elements_by_xpath("//*/input[@type='radio']"):
i.click()
driver.find_element_by_xpath("//*[@name='memberPass']").click()
driver.set_window_size(1280,800)
是否選中
driver.find_element_by_xpath("//*[@id='news']").is_selected()
控件尺寸
search_btn = driver.find_element_by_id('su')
search_btn.size
全選
element = driver.find_element_by_tag_name('body')
element.send_keys(Keys.CONTROL + 'a')
退格刪除
element = driver.find_element_by_id('kw')
element.send_keys("Selenium automation")
time.sleep(1)
element.send_keys(Keys.CONTROL+'a')
element.send_keys(Keys.BACKSPACE)
element = driver.find_element_by_xpath("//*[@id='lg']/img")
actionChains = ActionChains(driver)
actionChains.context_click(element).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ENTER).perform()
執行js
driver.execute_script("window.alert('這是一個alert彈框。');")
切換窗口
driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()
print driver.current_window_handle # 輸出當前窗口句柄
handles = driver.window_handles # 獲取當前全部窗口句柄集合
print handles # 輸出句柄集合
for handle in handles:# 切換窗口
if handle != driver.current_window_handle:
print 'switch to second window',handle
driver.close() # 關閉第一個窗口
driver.switch_to.window(handle) #切換到第二個窗口
iframe切換
driver.switch_to.frame("iframe1")
alert彈窗
driver.switch_to_alert().accept() # 點擊彈出裏面的確定按鈕
#driver.switch_to_alert().dismiss() # 點擊彈出上面的X按鈕
獲取全部圖片信息
for image in driver.find_elements_by_tag_name("img"):
print (image.text)
print (image.size)
print (image.tag_name)
獲取href屬性
for link in driver.find_elements_by_xpath("//*[@href]"):
print (link.get_attribute('href'))
保存截圖
driver.get_screenshot_as_file("C:\\Users\\你的賬戶名\\Desktop\\baidu.png")
中級
類、函數、模快調用
1. 類的定義,class開頭的就表示這是一個類,小括號裏面的,表示這個類的父類,涉及到繼承,默認object是所有類的父類。python中定義類,小括號內主要有三種:
1. 具體一個父類,2. object 3. 空白
2. 函數或方法的定義, def開頭就表示定義一個函數,方法包括,實例方法,
類方法,靜態方法,
注意看類方法和靜態方法定義的時候上面有一個@標記。
3. 對象調用方法和類調用方法的使用。
示例:
class ClassA(object):
string1 = "這是一個字符串。"
def instancefunc(self):
print ('這是一個實例方法。')
print (self)
@classmethod
def classfunc(cls):
print ('這是一個類方法。')
print (cls)
@staticmethod
def staticfun():
print ('這是一個靜態方法。')
test = ClassA() # 初始化一個ClasssA的對象,test是類ClassA的實例對象
test.instancefunc() # 對象調用實例方法
test.staticfun() # 對象調用靜態方法
test.classfunc() # 對象調用類方法
print test.string1 # 對象調用類變量
ClassA.instancefunc(test) # 類調用實例方法,需要帶參數,這裏的test是一個對象參數
ClassA.instancefunc(ClassA) # 類調用實例方法,需要帶參數,這裏的ClassA是一個類參數
ClassA.staticfun() # 類調用靜態方法
ClassA.classfunc() # 類調用類方法
super用來執行父類中的函數
命名規則
python中默認規則,包名和文件名都是小寫,類名稱單詞首字母大寫,函數名稱小寫,多個字母下劃線隔開。
入口函數
if __name__ == '__main__':
構造函數 __init_
讀取配置文件
import ConfigParser
config = ConfigParser.ConfigParser()
file_path = os.path.dirname(os.path.abspath('.')) + '/config/config.ini'
config.read(file_path)
browser = config.get("browserType", "browserName")
url = config.get("testServer", "URL")
獲取時間
time.time()
time.localtime()
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(
字符串切割
search_result_string.split('約')[1]
日誌
繼承
class ClassB(ClassA):
unittest測試單元
所有的測試函數都要test開頭
測試固件(test fixture)
一個測試固件包括兩部分,執行測試代碼之前的準備部分和測試結束之後的清掃代碼。這兩部分一般用函數setUp()和tearDown()表示。
測試用例(test case)
一個測試用例,包括測試固件,和具體測試業務的函數或者方法
測試套件 (test suite)
就是很多測試用例的集合
測試執行器 (test runner)
用來執行加載測試用例,並執行用例,且提供測試輸出的一個組建
runner=unittest.TextTestRunner()
runner.run(suite
POM 頁面與邏輯分離(基類+業務類+測試類)
加載測試用例到測試套件
suite = unittest.TestSuite()
suite.addTest(BaiduSearch('test_baidu_search'))
一次性加載一個類文件下所有測試用例到suite中
suite = unittest.TestSuite(unittest.makeSuite(BaiduSearch))
加載指定包下的所有用例
suite = unittest.TestLoader().discover("testsuites")
生成測試報告HTMLTestRunner
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.