Selenium學習整理(Python)
1 準備軟體
Selenium IDE
-
- firebug-2.0.19.xpi
- firepath-0.9.7-fx.xpi
- Firefox_46.0.1.5966_setup.exe
- 由於火狐瀏覽器高版本以後就不支援firebug,最好下載安裝49版本以下的。
- selenium_ide-2.9.1.xpi
WebDriver
-
- pip install selenium
- chromedriver.exe
- IEDriverServer.exe
- HTMLTestRunner.py
2 Selenium介紹
2.1 主要功能
-
- 測試與瀏覽器的兼容性——測試應用程式是否能夠在不同瀏覽器和作業系統上正常運行
- 測試系統功能——創建回歸測試以檢驗軟體功能和用戶需求,支援自動錄製動作和自動生成.NET、Java、Perl等語言的測試腳本
2.2 各版本和系統之間的關聯
-
- Selenium1.0
- Selenium IDE
- Firefox插件,可以錄製測試腳本、回放腳本以及生成基於Selenium Remote Control 模式的簡單程式碼
- Selenium Core
- 有斷言assertion機制的運行套件運行器test suite runner。js程式碼組成,故可以運行在各種瀏覽器中
- Selenium Remote Control
- 一個代理與控制端,支援多種語言
- Selenium2.0
- 集成Selenium1.0和WebDriver
3 Selenium IDE使用
3.1 Selenium IDE的安裝
selenium: B/S軟體功能自動化
IDE: 錄製、回放【不會自動打開瀏覽器】
3.2 Selenium IDE
1、 文件:創建、打開和保存測試案例和測試案例集。
編輯:複製、粘貼、刪除、撤銷和選擇測試案例中的所有命令。
Options :用於設置seleniunm IDE。
2、用來填寫被測網站的地址。
3、速度控制:控制案例的運行速度。
4、運行所有:運行一個測試案例集中的所有案例。
5、運行:運行當前選定的測試案例。
6、暫停/恢復:暫停和恢複測試案例執行。
7、單步:可以運行一個案例中的一行命令。
8、錄製:點擊之後,開始記錄你對瀏覽器的操作。
9、案例集列表。
10、測試腳本;table標籤:用表格形式展現命令及參數。source標籤:用原始方式展現,默認是HTML語言格式,也可以用其他語言展示。
11、查看腳本運行通過/失敗的個數。
12、當選中前命令對應參數。
13、日誌/參考/UI元素/Rollup
4 Selenium WebDriver
4.1 Selenium WebDriver簡介
Selenium IDE 1.0 不能處理的事件
-
- 本機鍵盤和滑鼠事件
- 同源策略跨站腳本(Cross Site Script XSS)/HTTP(S)
- 彈出框、窗口(基本身份認證、自簽名的證書和文件上傳/下載)
Selenium2.0 有簡潔的應用程式編程介面、WebDriver和WebElement對象,以及更好的抽象。同時,Selenium2.0 支援多種作業系統、多種語言、多種瀏覽器。
WebDriver是一套庫類,不依賴於任何測試框架,所以他自己本身就是一個輕便的自動化測試框架。除了必要的瀏覽器驅動外,WebDriver不需要啟動其他進程或安裝其他程式,也不必像Selenium1.0 那樣需要先啟動服務
4.2 Selenium WebDriver的安裝和配置
-
- pip install selenium
4.3 Selenium WebDriver入門實例
打開項目首頁,輸入用戶名、密碼,點擊登錄按鈕
1 import time 2 from selenium import webdriver 3 from selenium.webdriver.support.select import Select 4 5 driver=webdriver.Firefox() #打開瀏覽器 6 driver.get("//localhost:8080/ranzhi/www") #打開登錄介面 7 driver.find_element_by_id("account").clear() #定位到用戶名輸入框,清空 8 driver.find_element_by_id("account").send_keys("admin")#定位到用戶名輸入框,輸入admin 9 driver.find_element_by_name("password").clear() #定位到密碼輸入框,清空 10 driver.find_element_by_name("password").send_keys("123456") #定位到密碼輸入框,輸入密碼 11 driver.find_element_by_css_selector("#submit").click() #定位到登錄按鈕,點擊 12 time.sleep(3)
-
- driver:WebDriver對象,可以調用WebDriver中的方法,即WebDriver API
- get():打開指定的網站
- .find_element_by_…(…):自動化過程中 最常用的一個方法,用於在頁面中查找一個元素,其中傳入的參數是所定位呃元素
- .send_keys():用於定位 的文本框中輸入想要輸入的內容。上傳文件也可以用到
- .click():單擊事件,用於定位想要單擊的按鈕或者其他可以單擊的地方,以模仿滑鼠的單擊事件
因為WebDriver只能找到頁面中已有的元素,所以當頁面刷新時需要加入一個等待時間,讓頁面載入完畢,才能通過.find_element_by_…(…)找到想要的元素
-
- 顯示等待,導入time包,用time.sleep(秒數)使執行緒休眠,即設置了一個準確的等待時間,但這種方法會降低運行的效率,因為實際等待時間的長度會受外部環境影響
- 隱式等待,用WebDriver中的.implicitly_wait(秒數)。它告訴WebDriver,如果沒有馬上找到需要的元素,則在一段特定的時間內輪詢DOM來查找;如果超時後還沒找到則拋出異常。隱式等待會在WebDriver對象實例的整個生命周期中起作用
-
- .quit():退出瀏覽器,WebDriver中所有窗口
- .close():退出瀏覽器,只關閉當前頁面
4.4 WebDriver元素的定位
4.4.1 通過id定位
id:html標籤的id屬性值
dd.find_element_by_id(“html標籤的id屬性值”)
4.4.2 通過name定位
name:html標籤的name屬性值
dd.find_element_by_name(“html標籤的name屬性值”)
4.4.3 通過className定位
class:class=
dd.find_element_by_class_name(“html的class屬性值”) 【了解】
4.4.4 通過linkText定位
link:通過超鏈接標籤內容
dd.find_element_by_link_text(“超鏈接標籤內容”)
4.4.5 通過xpath定位
xpath:通過標籤在html頁面源碼路徑
絕對路徑:/html/body/table/tr/td[2]/input
相對路徑:.//input[@aa=”abc”]
.//*[@aa=”abc”]
.//標籤名[@屬性名=”屬性值”]
.//*[@屬性名=”屬性值”]
dd.find_element_by_xpath(“html標籤的xpath路徑”)
4.4.6 通過CSS選擇器定位
CSS:css樣式選擇器 # id選擇器
dd.find_element_by_css_selector(“html標籤的css樣式選擇器”)
4.4.7 其他定位
identifier:優先id的,如果沒有再去找name的
js:dom=document.getElementById(「password」)
dd.find_element_by_tag_name(“html標籤名”) 【了解】
4.5 實際結果獲取方式
打開項目首頁,驗證打開頁面是否為預期頁面
1 def testLoginSucc(self): 2 driver=self.dd 3 driver.get("//localhost:8080/ranzhi/www") # 打開登錄介面 4 er="登錄 - 然之協同" 5 rr=driver.title 6 self.assertEqual(er,rr) 7 self.rz.login(driver,"admin",123456) 8 err="然之協同 3.3111111111" 9 rrr=driver.find_element_by_xpath(".//*@id='bottomRightBar']/div/a").text 10 self.assertEqual(err,rrr)
dd.title:頁面標題,一般可以利用這個屬性判斷頁面是否跳轉成功
dd.find_element_by_…(…).text:頁面標籤內容
彈出框提示資訊:
dd.switch_to_alert().text
dd.switch_to.alert().text
4.6 關於瀏覽器的操作方法
1 dd.back() 後退 2 dd.forward()前進 3 dd.refresh(): 刷新 4 dd.close()關閉當前窗口 5 dd.quit() 關閉所有窗口
4.7 彈出窗口的切換方法
打開百度首頁,點擊學術,再到新標籤頁學術中點擊註冊
1 import time 2 from selenium import webdriver 3 from fun import * 4 5 dd=webdriver.Firefox() 6 dd.get("//www.baidu.com") 7 time.sleep(3) 8 a1=dd.window_handles 9 print(a1) 10 print(type(a1)) 11 clickByLink(dd,"學術") 12 time.sleep(3) 13 a2=dd.window_handles 14 print(a2) 15 dd.switch_to_window(a2[1]) 16 clickByLink(dd,"註冊") 17 18 time.sleep(3) 19 # dd.close() 20 dd.quit()
dd.window_handles: 獲取所有窗口句柄,list類型,每個元素都是一個窗口的唯一標識
dd.switch_to_window(具體窗口標識)
4.8 多個元素
dd.find_elements_by_id(“html標籤的id屬性值”)
…………………………….by_name(“html標籤的name屬性值”)
……………..by_css_selector(“html標籤的css樣式選擇器”)
……………..by_xpath(“html標籤的xpath路徑”)
……………..by_link_text(“超鏈接標籤內容”)
……………..by_tag_name(“html標籤名”) 【了解】
………………by_class_name(“html的class屬性值”) 【了解】
定位到多個頁面元素,返回list類型,list內每個元素都是一個具體的頁面控制項
5 Unittest框架和WebDriver
5.1 Unittest
5.2 Unittest的使用
1 import unittest 2 3 class Test1(unittest.TestCase): 4 @classmethod 5 def setUpClass(self): 6 print("execute setUpClass") 7 8 @classmethod 9 def tearDownClass(self): 10 print("execute tearDownClass") 11 12 def setUp(self): 13 print("execute setUp") 14 15 def tearDown(self): 16 print("execute tearDown") 17 18 def test_one(self): 19 print('execute test_one') 20 self.assertTrue('FOO'.isupper()) 21 22 def test_two(self): 23 print('execute test_two') 24 25 26 if __name__ == '__main__': 27 unittest.main()
5.3 模擬鍵盤滑鼠移動
鍵盤:
dd.find_element_by_….(…).send_keys(Keys.ENTER) 點擊Enter
…………………………………(Keys.BACK_SPACE) 點擊BACK_SPACE
…………………………………(Keys.CONTROL,”a”) 全選
…………………………………(Keys.CONTROL,”c”) 複製
…………………………………(Keys.CONTROL,”v”) 粘貼
…………………………………(Keys.CONTROL,”x”) 剪切
滑鼠:
ActionChains(dd).double_click(定位到的一個具體頁面控制項).perform() 雙擊
……………..context_click…………………………….. 右鍵
……………..move_to_element…………………………… 游標懸停懸浮
#雙擊 ActionChains(dd).double_click(dd.find_element_by_xpath(“.//*[@id=’s-menu-1′]/button”)).perform() #右鍵 ActionChains(dd).context_click(dd.find_element_by_xpath(“.//*[@id=’s-menu-1′]/button”)).perform() #游標懸停懸浮 ActionChains(dd).move_to_element(dd.find_element_by_xpath(“.//*[@id=’s-menu-1′]/button”)).perform()
滾動條:
滾動條拖到底部
js=”var q=document.documentElement.scrollTop=10000″
dd.execute_script(js)
滾動條拖到頂部
js=”var q=document.documentElement.scrollTop=0″
dd.execute_script(js)
1 js="var q=document.documentElement.scrollTop=10000" 2 dd.execute_script(js) 3 time.sleep(3) 4 js="var q=document.documentElement.scrollTop=0" 5 dd.execute_script(js)
5.4 文件處理
文件:
打開一次只能讀或者寫,不能同時進行
ff=open(“文件名”,”打開方式”)
ff.write(“寫入內容”)
w+: 如果文件不存在,新建一個寫,如果文件存在,新建一個覆蓋
a+: 如果文件不存在,新建一個寫,如果文件存在,在文件末尾追加 【焦點默認在最後】
r+: 如果不文件不存在,報錯,如果文件存在,從前往後覆蓋
ff.read(數字):讀數字個字元 【從當前焦點開始】
ff.read():讀所有內容 【從當前焦點開始】
ff.readline():讀一行 【從當前焦點開始】
ff.readlines():讀所有行 list類型,每一行都是list內的元素 【從當前焦點開始】
ff.tell(): 返回當前焦點位置
ff.seek(數字):焦點跳轉到數字位置
ff.close() :關閉
csv文件:
import csv:
讀:
ff=open("aaa.csv","r+") #打開csv文件 cr=csv.reader(ff,dialect="excel") cr:文件內容,循環獲取每一行內容 for c in cr: print(c) ff.close() #關閉
寫:
1 ff=open("bbb.csv","w+") #創建csv文件 2 cw=csv.writer(ff) #創建csv文件寫載入器 3 4 cw.writerow(寫入內容) #通過載入器寫數據到csv文件 5 6 ff.close() #關閉
5.5 測試報告
1 import unittest 2 from HTMLTestRunner import HTMLTestRunner 3 4 import test11 5 6 suite=unittest.TestSuite() #創建測試套件對象 7 loader=unittest.TestLoader()#創建測試用例載入器對象 8 suite.addTest(loader.loadTestsFromModule(test11))#通過用例載入器載入用例到測試套件 9 10 ff=open("testReport.html","wb+") #創建測試報告文件 11 #創建HTMLTestRunner對象 12 runer=HTMLTestRunner(stream=ff,title="然之測試", description="然之測試然之測試然之測試然之測試") 13 runer.run(suite) #通過HTMLTestRunner對象執行測試用例 14 ff.close() #關閉報告文件