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]
日誌
  1. 指定保存日誌的文件路徑,日誌級別,以及調用文件 
  2.             將日誌存入到指定的文件中 
  3.         :param logger: 
  4.         """  
  5.         # 創建一個logger  
  6.         self.logger = logging.getLogger(logger)  
  7.         self.logger.setLevel(logging.DEBUG)  
  8.   
  9.         # 創建一個handler,用於寫入日誌文件  
  10.         rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))  
  11.         log_path = os.path.dirname(os.getcwd()) + '/Logs/'  
  12.         log_name = log_path + rq + '.log'    
  13.         fh = logging.FileHandler(log_name)  
  14.         fh.setLevel(logging.INFO)  
  15.   
  16.         # 再創建一個handler,用於輸出到控制檯  
  17.         ch = logging.StreamHandler()  
  18.         ch.setLevel(logging.INFO)  
  19.   
  20.         # 定義handler的輸出格式  
  21.         formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
  22.         fh.setFormatter(formatter)  
  23.         ch.setFormatter(formatter)  
  24.   
  25.         # 給logger添加handler  
  26.         self.logger.addHandler(fh)  
  27.         self.logger.addHandler(ch)
繼承 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


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