一步到位帶你入門Selenium


   其實,關於這篇文章發布前還是有很多思考的,我是不想發布的,因為關於selenium的文章博客園里面有很多的介紹,寫的詳細的,也有寫的不詳細的,那么我的這篇文章的定位是基於selnium從開始到最后的框架組織。其實套路和很多的教程類似,但是更多的是本篇文章是以筆記的形式展示給大家,可能對於一些初學者來說,並不是一篇很好的文章,但是對於一些有經驗的測試童鞋來說,本篇確是值得你回憶selenium過往的一篇文章。

 一、Selenium自動化測試環境搭建

1.cmd --- pip install selenium==2.53.0 (如果selenium后面不跟==,表示默認安裝最新版本) 2. pip show selenium 查看selenium安裝的版本號(該操作在cmd->windows下面查看) (注意:1.pip 是什么? pip是python2.7.9版本以后自動集成到python中的一個包管理工具,方便下載和python 有關的包或者模塊) 3.驗證環境是否安裝成功python交互模式下--->輸入from selenium import webdriver -->運行無報錯(安裝成功) 4.配置瀏覽器驅動,這里我們教學使用的chrome瀏覽器,目前最新的版本是63.0.3239.84(正式版本) 5.下載谷歌瀏覽器的驅動文件 chromedriver.exe 谷歌瀏覽器驅動下載地址: http://chromedriver.storage.googleapis.com/index.html 谷歌瀏覽器驅動及版本對應匹配參考表: http://chromedriver.storage.googleapis.com/index.html 6.直接將chromedriver.exe (chromedriver.exe原封不動復制到C:\Python27目錄下面) 7.在idle編輯器里面敲一段代碼: from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.baidu.com')

二、PyCharm開發集成環境部署及快捷鍵

1.科學上網:訪問 https://www.jetbrains.com/pycharm/download/#section=windows
2.選擇community(社區版) 版本 足夠用

快捷鍵:

1.注釋 ctrl + /
2.取消注釋 在次ctrl + / 
3.運行 右鍵點擊Run按鈕 或者使用快捷鍵 ctrl + shift + F10 4.創建python文件 1.點擊編輯器主項目工程文件目錄->file->python file 2.在windows下面的主項目工程文件目錄里面->創建一個pyhton文件 如demo.txt ---->demo.py 5.替換 ctrl+r  替換單個或者替換多個 replace replace all    6.回退 shift+table 7.縮進 table 8.#coding=utf-8 (中文編碼的聲明 允許在編輯中寫入中文注釋 否則報錯)

三、前端工具的安裝

目的:方便web頁面的元素定位。 只有火狐瀏覽器提供。高版本的火狐瀏覽器沒有,只有低版本的有這個插件。 FireBug:附加組件--擴展--搜索firebug--點擊安裝--重啟---F12查看 小蟲子 FirePath:附加組件--擴展--搜索firepath--點擊安裝--重啟---F12查看 小蟲子上面有沒有firepath

四、前端技術講解

前端三劍客:   HTML   CSS   Javascript HTML靜態網頁 == 文檔 標簽有開口有閉合(並不是所有標簽都有閉合標簽 如 img input標簽): 開始標簽: <a> 結束標簽: </a> 標簽都是有層級關系的:爺爺類標簽-->父類標簽-->子類標簽 自動化測試要定位元素---->要認識HTML頁面---->要了解HTML頁面的層級關系--->學會用程序的視角去找到他們

HTML中的常用標簽說明:

<html> 聲明 這是一個HTML文檔 <head> HTML標簽的頭部 <body> 身體包含了N多組標簽對 <a> 超鏈接 如果a標簽后面跟着 href="任何鏈接" 說明<a>一定是鏈接 <p> 段落 <img> 圖像 <input> 輸入 文本框 <form> 表單(結構 包含input 包含一個button) <title> 窗口的標題 <iframe> 框架 HTML中的框架 <div> 無名式 代表的是塊級元素 div是一個容器 可以包含任意標簽 <span> 無名式 代表的是塊級元素 span是一個文本容器 可以包含任意標簽

什么是元素?

HTML中的開始標簽和結束標簽之間的所有代碼都是元素,元素有屬性和屬性值。 demo: <input id="kw" name="wd" class="s_ipt" value="" maxlength="100" autocomplete="off"> 如上所述 id 是該元素中的一個屬性 它的屬性值是 kw 依此類推 檢查屬性值的唯一性: f12 -->ctrl + f -->拷貝屬性對應的屬性值--復制到HTML中的文本框-->enter鍵查看該屬性值是否在整個頁面中是否唯一,如果唯一就可以使用該元素去定位。

五、Webdriver API 學習
什么是webdriver API?

  他是一套操作瀏覽器的規范。可以理解為一套N多個函數來實現操作瀏覽器的方法的集合。比如:元素定位/操作瀏覽器 /最大化窗口/設置等待/多窗口切換/切換框架/操作警告框等

元素的八大定位精講

id
name
class_name
link_text
partial_link_text
tag_name
xpath
css_selector 

以上8種元素定位在Python語言中對應的寫法如下:

.find_element_by_id('id的屬性值') #必須掌握
.find_element_by_name('name的屬性值') #必須掌握
.find_element_by_class_name('class的屬性值') #必須掌握
.find_element_by_link_text('文本鏈接') #必須掌握
.find_element_by_partial_link_text('部分文本鏈接') #了解
.find_element_by_ tag_name('標簽名') #了解
.find_element_by_xpath('很多') #超級重點
.find_element_by_css_selector('很多') #超級重點

.click() 點擊事件
.send_keys() 向文本框輸入內容

1.使用id定位百度文本框 driver.find_element_by_id('kw').send_keys('demo') 2.使用name定位百度文本框 driver.find_element_by_name('kw').send_keys('demo') 3.使用class定位百度文本框 driver.find_element_by_class_name('s_ipt').send_keys('demo') 4.使用link_text定位百度首頁新聞鏈接 driver.find_element_by_link_text(u'新聞').click() 5.partial_link_text部分文本定位新聞鏈接 driver.find_element_by_partial_link_text(u'').click() 6.使用tag定位百度文本框(不建議使用該方法 因為實際項目中標簽名重復的概率非常大 不能代表要定位的元素的唯一性) driver.find_element_by_tag_name('input').send_keys('demo')

7.定位界的倚天劍 --------xpath 定位

定位的優缺點: 優點: 定位語法豐富 當元素沒有屬性時可以通過xpah的路徑定位 缺點:1.抗變性弱 2.不穩定 3.查找速度慢(相對於CSS定位) xpath 的層級關系表示方法: / a.絕對路徑定位(不穩定,從根一級級往里找) driver.find_element_by_xpath('html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys('demo') b.相對路徑定位(層級和屬性結合定位,經常用) driver.find_element_by_xpath("//input[@id='kw']").send_keys('demo') c.父類屬性和層級關系定位(很強大,很實用) driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('demo') d.爺爺類屬性和層級關系定位(一定能定位) driver.find_element_by_xpath("//form[@id='form']/span/input").send_keys('demo') e.使用邏輯運算符定位 and driver.find_element_by_xpath("//input[@name='wd' and @autocomplete='off']").send_keys('demo')

8.定位界的屠龍刀---CSS定位

CSS是層疊樣式表,用於美化web頁面的一種技術,我們主要使用CSS中的選擇器作為我們元素定位的一種策略。 CSS定位優缺點: 優點:1.語法簡潔 2.定位速度快 3.抗變性強 缺點:暫時沒發現 CSS的層級關系表示方法: > CSS簡寫說明: id -----------------> # class ------------------> . 8.1CSS使用id class定位百度文本框 driver.find_element_by_css_selector("#kw").send_keys('demo') driver.find_element_by_css_selector(".s_ipt").send_keys('demo') 8.2CSS使用屬性定位(很常用) driver.find_element_by_css_selector("input[id='kw']").send_keys('demo') 8.3CSS的父類屬性和層級定位方法(和xpath區分開 用的也比較多) driver.find_element_by_css_selector("span#s_ipt_wr>input.s_ipt").send_keys('demo') 8.4CSS的爺爺屬性和層級定位方式 driver.find_element_by_css_selector("form#form>span>input").send_keys('demo')

登錄sina郵箱發郵件實戰:

1.手動注冊一個新浪郵箱http://mail.sina.com.cn/
2.模擬用戶輸入賬號和密碼 3.模擬用戶點擊登錄按鈕 4.輸出 Login is ok---------->
5.點擊寫信----->收件人----->主題----->寫入內容(收件人為同桌的郵箱賬號) (定位過程中多使用css定位,少用xpath)

元素定位注意事項:
定位前先思考:

a.有id屬性優先使用id定位。沒有id的盡量使用css、xpath定位。 b.Xpath/CSS/定位的靈活運用 c.對HMTL各類標簽代表的含義補充學習 d.一個定位方式行不通,可以多嘗試其他的定位方式(不要一個樹上吊死) e.元素的屬性值如果數字、動態變化的,你應該放棄使用該屬性

腳本中檢查:

1.腳本的上下文是否引入sleep 增強腳本穩定性 2.元素的屬性值是否唯一 3.元素的屬性值是否真實可見 is_displayed() 4.元素是否在iframe框架中? 5.元素定位方式需要改變 6.元素是否真正定位到是真正的元素 7.網絡環境是否良好 8.Web頁面操作前后頁面關聯是否是否檢查過?思考過? 9.定位元素的代碼是否是正常的 比如代碼敲錯了 或者是否引入了相關的模塊 沒加相關的聲明 #coding=utf-810.認真檢查控制台的報錯信息 代碼報錯行數

六、Webdriver api 繼續

1.控制瀏覽器

.maximize_window() 最大化瀏覽器窗口
.set_window_size(a,b) a、b代表的瀏覽器的長寬
.forword()    前進操作
.back() 后退操作
.refresh() 模擬F5刷新

代碼示例:

from time import sleep from selenium import webdriver driver = webdriver.Chrome() #調用谷歌瀏覽器驅動
driver.get("https://www.baidu.com") #訪問百度站點
sleep(3) driver.maximize_window() #最大化窗口
sleep(4) driver.find_element_by_link_text(u'新聞').click() sleep(3) driver.back() #返回百度首頁
print driver.current_url #獲取url
sleep(3) driver.forward() #前進新聞頁面
print driver.current_url #獲取url
sleep(5) driver.refresh() #模擬瀏覽器刷新
sleep(5) driver.set_window_size(900,900) #設置瀏覽器長和寬
sleep(3) driver.quit() #關閉瀏覽器

2.webdriver 常用操作方法

.click() 點擊事件 
.send_keys() 向文本框輸入內容
.quit() 關閉所有瀏覽器窗口
.close() 只關閉當前窗口
.clear() 清空

3.webdriver常用接口方法

.text 獲取元素對應文本 .is_displayed() 檢查元素是否用戶可見 實例: demo = driver.find_element_by_id('kw').size #文本框的尺寸
print demo demo = driver.find_element_by_id('cp').text #打印元素對應的文本
print demo demo = driver.find_element_by_id('kw').is_displayed() #檢查元素是否用戶可見
print demo 4.獲取驗證信息 webdriver提供了三種驗證信息的方法,也叫斷言。根據測試用例中的描述的規程一步一步的執行測試用例,在最后會將測用例的實際結果很預期結果進行比較,這種方式在自動化測試中叫:斷言。 .url (由句柄提供) .text (由元素定位提供) .title (由句柄提供) #text 獲取元素對應的文本進行斷言
text = driver.find_element_by_css_selector('span[class="nick"]').text if text == 'luruifengx@sohu.com': print 'login is ok--------------->'
else: print 'login is error---------------->'


#title 窗口標題
title = driver.title if title == u'我的通行證': print 'login is ok--------------->'
else: print 'login is error---------------->'

#url 通過url做斷言
url = driver.current_url if url == u'https://passport.sohu.com/mypassport/index': print 'login is ok--------------->'
else: print 'login is error---------------->'

5.設置元素等待

sleep(S) Python的time模塊提供的方法 強制等待
.implicitly_wait(S) 是webdriver提供的隱式等待 (比較溫柔,這個用法和網絡傳輸速度有關系,比較智能一些對比強制等待
原理是:在規定時間內比如設置60S,那么假如在運行第10S元素訪問到了則會繼續往下執行腳本,否則將以輪詢的方式不斷的去判斷元素是否被加載出來)

6.上傳文件

webdriver中的send_keys()支持上傳文件 該操作只能針對的是標簽 input 標簽 使用方法:send_keys('上傳本地文件的路徑') driver.find_element_by_name("file").send_keys("上傳本地文件所在路徑")

7.JS操作瀏覽器滾動條
調用js代碼實現
excute_script("window.scrollTo(0,2500);") 從最頂端拉到最下面(實際項目中最常用)2500為一般參考值,具體要看需求,有的可能1000就到滾動條的底部

driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("python") driver.set_window_size(800,600) driver.find_element_by_id("su").click() time.sleep(5) driver.execute_script("window.scrollTo(0,2500);") #上---->下
time.sleep(5) driver.execute_script("window.scrollTo(2500,0);") #下---->上
driver.execute_script("window.scrollTo(900,900);") #從上網下 從左往右 同時拖動

8.多窗口切換

句柄.switch_to.window(句柄.window_handles[1]) #跳轉到第二個窗口
switch_to.window 切換窗口 window_handles[1] [1] 代表的是切換到第二個窗口 window_handles[2] [2] 代表的是切換到第三個窗口

9.下拉框處理

有三種定位策略 1. 引入一個Select類 (下拉框的實現必須是select標簽才可以使用1方法) from selenium.webdriver.support.select import Select 引入select類 Select(demo).select_by_index(2) #通過索引
Select(demo).select_by_value('2') #通過value值
Select(demo).select_by_visible_text(u'審核不通過') #通過文本描述
time.sleep(5) 2.鏈式定位 第一步:先定位下拉框大標簽,將定位的結果賦值給一個變量demo 第二步:拿着第一步中賦值好的demo,直接操作下拉框里面的選項 demo = driver.find_element_by_name('status') demo.find_element_by_css_selector("option[value='1']").click() 3.一步到位法 driver.find_element_by_name('status').find_element_by_css_selector("option[value='1']").click() driver.find_element_by_name('status') #定位下拉框
find_element_by_css_selector("option[value='1']").click() 選擇里面的選項

10.警告框的處理

有三種表現形式: 1.alert 只有一個確定按鈕 2.confirm 有一個確定按鈕和一個取消按鈕 3.prompt() 有一個確定按鈕和一個取消按鈕,還有一個文本框 以上三種統一的定位方式如下: 句柄.switch_to.alert.accept( ) 接收彈窗 句柄.switch_to.alert.dismiss( ) 拒絕彈窗

11.多框架iframe處理
有兩種形式: 1.平行框架 2.嵌套框架

1.iframe標簽本身有id/name的情況 句柄.switch_to.frame('id或者name的屬性值') 然后繼續操作下面的步驟即可。 2.iframe標簽本身有id/name的情況 a.先使用Xpath定位到iframe標簽,將結果賦值給一個變量demo b.使用a中定義好的變量執行下面的語句 句柄.switch_to.frame(demo) demo=driver.find_element_by_xpath('//*[@id="f1"]') #先定位大框架 (demo為變量名字)
driver.switch_to.frame(demo) demo=driver.find_element_by_xpath('//*[@id="f2"]') #再定位小框架
driver.switch_to.frame(demo) 3.框架有進入就要有退出(除嵌套框架以外)----針對是平行框架 句柄.switch_to.default_content()

七、面向對象編程(三大特點:繼承/多態/封裝)

1.類定義:類是一個具有相同屬性或者方法的集合。 2.類的寫法:
a.定義類的關鍵字:
class
b.類的關鍵字后面跟的是類的名字,類的首字母一般是 大寫 class Student(): pass #如果這個類什么都不做 使用pass表示
c.類下面的def (函數)我們叫類方法,不叫函數。類方法中的第一個參數是self,self代表的是類本身自己屬性。 self一定要寫在類方法中的第一個位置,在進行傳參的時候,我們可以不對self傳參。 d.訪問類下面的屬性時通過創建化對象進行訪問,如果在創建類的時候,給類強制性的綁定一些屬性以后,這時訪問類的時候 需要進行對應的傳參。
#代碼示例
class Stundent():   pass bart = Stundent() #創建一個實例對象
print bart #查看創建實例對象所在計算機內存位置
bart.name = 'zhangshan'
print bart.name

3.類的初始化 __init__方法

#代碼示例
class Student(): def __init__(self,name,age):   self.name = name   self.age = age demo = Student('zhaoming',250) a = demo.name b = demo.age print a,b class Student(): def __init__(self,name,age):   self.name = name   self.age = age def print_message(self):   print 'hello,{} my age is {}'.format(self.name,self.age) demo = Student('zhaoming',250) demo.print_message() 4.類的繼承 class Animals(): def running(self):   print "Animals is running---------------->"

class Dog(Animals):   pass real_demo = Dog() print real_demo real_demo.running() #訪問animals下面的running方法

class Animals():   def running(self):     print "Animals is running---------------->"
class Dog(Animals):   def singsing(self):     print 'dog is singsing+++++++++++++++>'

if __name__ == "__main__":   real_demo = Dog()   real_demo.running() #訪問animals下面的running方法
  real_demo.singsing()

5.學生成績封裝 (函數對比類實現)  函數式編程 面向整個過程 注重的功能的實現

std1 = {'name':'zhangshan','score':150} std2 = {'name':'lukuncai','score':100} def print_score(std): print "student:{},score:{}".format(std['name'],std['score']) print_score(std1) print_score(std2)

面向對象編程把學生看做一個類,學生有name score屬性 print_score功能

class Student(object): def __init__(self,name,score): self.name = name self.score = score def print_score(self): print "student:{},score:{}".format(self.name,self.score) if __name__=='__main__': demo1 = Student('zhangshan',150) demo2 = Student('lukuncai',100) print demo1,demo2 demo1.print_score()

八、unittest單元測試框架
每一種開發語言都有自己的原生的單元測試框架。

(pyunit)unittest --------> Python語言內部的一個單元測試框架 pytest --------> Python語言內部的單元測試框架 TestNg、Junit --------------->Java語言的原生框架

1.unittest單元測試框架好處

a.提供用例的組織和管理
b.提供豐富的斷言方法
    assertIn(a,b)
    assertEqual(a,b)
    assertTrue(a)
    assertIs(a,b)
..............
c.提供豐富的日志(執行的測試用例數量,通過數有多少,失敗數量有多少,環境信息)

2.unittest單元測試框架組成

import unittest #導包unittest
class Leiming(unittest.TestCase): #定義一個測試類 類名Leiming 繼承unittest.TestCase

    def test_Add(self): #test method names begin 'test*'
        #測試用例的開頭必須以test test后面跟什么不需要關注
        self.assertEqual(3, 3) #assertEqual(a,b) 斷言的函數 由TestCase提供,表示a是否等於b

    def test_Multiply(self): self.assertEqual(10, 0) if __name__ == '__main__':#作用是用來運行整個模塊的主函數
 unittest.main() #.main方法是unittest下面提供的方法 用來運行整個測試用例中以test開頭的測試用例

3.自動化測試用例執行順序
   0-9數字優先----->其次A-Z大寫字母------>最后a-z小寫字母

import unittest class Test(unittest.TestCase): def test123Add(self): print '第一次打印------------->'

    def test123Aub(self): print '第一次打印+++++++++++++>'

    def test123(self): print '第一次打印%%%%%%%%%%%%%%'

if __name__=="__main__": unittest.main() 

4.前置條件和后置條件

前置:setUp()
后置:tearDown( )
前置指的是:比如打開瀏覽器、最大化窗口、休眠等一系列動作,都可以看做是前置。
后置指的是:執行完測試用例,數據還原,瀏覽器的關閉等操作。
前置和后置屬於非必要條件,如果在前置條件和后置條件什么都不做,用pass 表示。但是一般寫自動化測試腳本必須要有前置和后置。結構清晰、組織代碼正常運行。
import unittest class Test(unittest.TestCase): def setUp(self): print '111111111111111111111111111111'

def test123Add(self): print '第一次打印------------->'

def test123Aub(self): print '第一次打印+++++++++++++>'

def test123(self): print '第一次打印%%%%%%%%%%%%%%'

def tearDown(self): print '00000000000000000000000000000000'

if __name__=="__main__": unittest.main()

運行看效果。

5.unittest單元測試框架之--斷言

什么是斷言?
在編寫用例的過程中,不管用例的執行過程是怎樣的,最初都會有一個預期結果,用例的執行就是通過執行用例的步驟,驗證實際的結果是否與預期結果相等。unittest 框架的 TestCase 類提供一些方法用檢查比較和報告失敗。
assertEqual(a,b) ----------判斷a是否等於b assertNotEqual(a,b) --------判斷a是否不等於b assertIn(a,b) -------- 判斷a是否在b中 assertNotIn(a,b) --------判斷a是否不在b中 assertTrue(x) --------判斷x是否為真 assertFalse(x) --------判斷x是否為假 assertIs(a,b) -------- 判斷a是否是b

6.整合百度/有道測試用例到uniitest單元測試框架

import unittest,time from selenium import webdriver class Test_baidu_search(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.base_url = 'https://www.baidu.com' self.driver.implicitly_wait(30) self.driver.maximize_window() def test_baidu(self): '''百度搜索測試用例''' driver = self.driver driver.get(self.base_url) driver.find_element_by_css_selector('#kw').send_keys('demo') driver.find_element_by_css_selector('#su').click() time.sleep(3) title = driver.title self.assertEqual(title,u'demo_百度搜索') def test_youdao(self): '''有道搜索測試用例''' driver = self.driver driver.get('http://www.youdao.com/') driver.find_element_by_name("q").clear() driver.find_element_by_name("q").send_keys("webdriver") driver.find_element_by_xpath("//*[@id='form']/button").click() time.sleep(2) driver.find_element_by_xpath("html/body/div[7]/i/a[1]").click() text01 = driver.find_element_by_css_selector("span[class='keyword']").text self.assertEqual(text01,'webdriver') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()

7.引包機制

  • 同級引包
  • 跨目錄引包

pub.py下面的代碼:

def add(a,b): return a+b def sub(a,b): return a-b

from Change_Directory.count import add,sub

print add(1,2)
print sub(1,2)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM