2.自動化測試之python+selenium基礎

元素的定位      瀏覽器控制      鼠標事件           鍵盤事件          獲取驗證
        sleep休眠      多表單切換       多窗口切換         
     上傳文件      
              
 
1、元素的定位

1.webdriver提供的8種頁面元素定位方法:javascript

    id/name/class name/tag name/link text/partial link text/xpath/css selector
    其中python對應的8種方法:
    find_element_by_id()                       如: find_element_by_id("kw")  
    find_element_by_name()                     如: find_element_by_name("wd")
    find_element_by_class_name()               如: find_element_by_class_name("s_ipt") 
    find_element_by_tag_name()                 如: find_element_by_tag_name("input") 
    find_element_by_link_text()                如:find_element_by_link_text(u"新聞")    
    find_element_by_partial_link_text()        如:find_element_by_partial_link_text(u"一個很長的") 
    find_element_by_xpath()                    如: find_element_by_xpath(" .//*[@id='kw']")  
    find_element_by_css_selector()             如: find_element_by_css_selector("#kw")
    注意:
    a.python對中文支持很差,在對於有中文的地方加小寫u,做用是把中文字符串轉換成unicode編碼,如上面link_text(u"新聞")  
    b.xpath中若是不想指定標籤名,也可用(*)代替,
2.xpath定位
    2.1 絕對路徑定位:find_element_by_xpath("/html/body/div/div[2]/div/form/span/input") 
    2.2 利用元素屬性定位:find_element_by_xpath("//*/input[@id='kw']")                      //表示當前目錄  
    2.3 層級與屬性結合:find_element_by_xpath("//span[@class='bg s_pt']/input")         /input表示父元素下的子元素
                        能夠用這種方法,一層層網上,直到最外層<html>標籤
    2.4 使用邏輯運算符:find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")
3.css定位        速度快於xpath
    css常見語法:
                
    例如:
        經過.class定位的:  find_element_by_css_selector(".intr")
        經過#id定位的:     find_element_by_css_selector("#firstname")
        經過標籤名定位的:  find_element_by_css_selector("input")
        經過父子關係定位的:find_element_by_css_selector("div>input")
        經過屬性定位:      find_element_by_css_selector("input[type='submit']")
        組合定位:          find_element_by_css_selector(span.bg s_ipt>input.s_ipt)  
                                            //父標籤span對應class屬性爲bg s_ipt的節點下的子標籤input且這個子標籤class屬性爲s_ipt   
 
2、瀏覽器控制
    1.控制瀏覽器大小:set_window_size()    例如:driver.set_window_size(400,500)
                      maximize_window()    例如:driver.maximize_window()  #無參數
    2.瀏覽器後退、前進:back()-後退、farward()-前進
 
3、鼠標事件
    ActionChains類提供的經常使用方法:
        1.1 perform():執行ActionChains中存儲的全部行爲,對整個事件進行提交
        1.2 context_click():    右擊
        如:
           from selenium.webdriver.common.action_chains import ActionChains
                ...
           ActionChains(dr).context_click(docfile).perform()
        1.3 double_click():     雙擊
        如:
           from selenium.webdriver.common.action_chains import ActionChains
                ...
           doubleClick=dr.find_element_by_id("xxx")
           ActionChains(dr). double_Click(doubleClick).perform()        
        1.4 drag_and_drop(source,target):    拖動
        如:
            from selenium.webdriver.common.action_chains import ActionChains
                ...
            dsource=dr.find_element_by_id("xxx")        #拖動的源元素
            dtarget=dr.find_element_by_id("xxx")        #釋放的目標目標元素
           ActionChains(dr).drag_and_drop(dsource,dtarget).perform()
        1.5 move_to_element():  鼠標懸停
        如:
           from selenium.webdriver.common.action_chains import ActionChains
                ...
           above=dr.find_element_by_id("xxx")
           ActionChains(dr).move_to_element(above).perform()
4、鍵盤事件    
    1.首先要導入鍵盤事件的包
  1. from selenium.webdriver.common.keys importKeys
  2. ...
  3. dr.get("http://www.baidu.com")
  4. #輸入內容
  5. dr.find_element_by_id("kw").send_keys("seleniumm")
  6. #刪除輸入內容的最後一個字母,
  7. dr.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
  8. #輸入:空格+教程
  9. dr.find_element_by_id("kw").send_keys(Keys.SPACE)
  10. dr.find_element_by_id("kw").send_keys(u"教程")
  11. #ctrl+a全選輸入框內容
  12. dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
  13. #ctrl+x剪貼輸入框內容
  14. dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
  15. #ctrl+v剪貼輸入框內容
  16. dr.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
  17. #回車鍵操做
  18. dr.find_element_by_id("su").send_keys(Keys.ENTER)
  19. dr.close()
    經常使用的鍵盤操做整理:
    send_keys(Keys.BACK_SPACE)  #刪除鍵BackSpace
    send_keys(Keys.SPACE)       #空格鍵Space
    send_keys(Keys.TAB)         #製表鍵Tab
    send_keys(Keys.ESCAPE)      #回退鍵Esc
    send_keys(Keys.ENTER)       #回車鍵Enter
    send_keys(Keys.CONTROL,'a') #Ctrl+a
    send_keys(Keys.CONTROL,'c') #Ctrl+c    
    send_keys(Keys.CONTROL,'x') #Ctrl+x
    send_keys(Keys.CONTROL,'v') #Ctrl+x
    send_keys(Keys.F1)          #F1,相似的有F1-F12
5、獲取驗證
    1.一般用到的驗證信息有:title、URL、text
dr.title
dr.current_url
dr.find_element_by_id("xx").text
 6、設置等待    
    1.顯示等待:等待某個條件成立時,繼續執行,不然達到最大等待時間後拋出異常:TimeoutException,顯示等待是針對當前要定位元素使用
WebDriverWait(driver, timeout,poll_frequency,ignored_exceptions=None).until(method,message)    
示例:
WebDriverWait(dr,5,0.5,None).until(
     expected_conditions.presence_of_element_located((By.ID,"kw1")),message='test') 
解釋:
A.WebDriverWait():在設置時間內,默認間隔一段時間檢測一次當前頁面元素是否存在,若超過當前指定時間檢測不到則拋出異常;
B.driver:webdriver的瀏覽器驅動,ie、firefox、chromea
C.timeout:最長超時時間,以秒爲單位
D.poll_frequency:休眠間隔時間-步長,默認0.5秒
E.ignored_exceptions:超時後異常信息,默認拋出NoSuchElementException異常
F.until(method,message): 調用該方法提供的驅動做爲一個參數,直到返回值爲True
G.until_not(method,message):調用該方法提供的驅動做爲一個參數,直到返回值爲False
H.expected_conditions類提供的預期條件實現有:
    title_is:判斷標題是不是xx
    title_contains:判斷標題是否包含xx
     presence_of_element_located:元素是否存在
     visibility_of_element_located:元素是否存在
     visibility_of:是否可見
     presence_of_all_elements_located:判斷一組元素是否存在
     text_to_be_present_in_element:判斷元素是否有xx文本信息   
     text_to_be_present_in_element_value:判斷元素值是否有xx文本信息   
     frame_to_be_available_and_switch_to_it:表單是否可見,並切換到該表單
    invisibility_of_element_located:判斷元素是否隱藏
    element_to_be_clickable:判斷元素是否點擊,它處於可見和啓動狀態
    staleness_of:等到一個元素再也不依附於DOM
    element_to_be_selected:被選中的元素
    element_located_to_be_selected:一個指望的元素位於被選中
    element_selection_state_to_be:一個指望檢查若是給定元素被選中
    element_located_selection_state_to_be:指望找到一個元素並檢查是不是選擇狀態
    alert_is_present:預期一個警告信息   

 

    2.隱式等待:經過必定的時長等待頁面全部元素加載完成,哪一個元素超出設置時長沒被加載就拋出異常NoSuchElementException,隱式等待是針對全部元素的
 
        implicitly_wait(5)    #默認單位爲秒
    示例:
        dr.implicitly_wait(5)
7、sleep休眠    python中強制的程序等待
    from time import sleep
    sleep(4)    #默認單位秒,設置小於1秒的時間能夠用小數點如sleep(0.6)
8、定位一組元素,相似與1中定位單個元素方法
    find_elements_by_id()                     如: find_elements_by_id("kw")  
    find_elements_by_name()                   如: find_elements_by_name("wd")
    find_elements_by_class_name()             如: find_elements_by_class_name("s_ipt") 
    find_elements_by_tag_name()               如: find_elements_by_tag_name("input") 
    find_elements_by_link_text()              如:find_elements_by_link_text(u"新聞")    
    find_elements_by_partial_link_text()      如:find_elements_by_partial_link_text(u"一個很長的") 
    find_elements_by_xpath()                  如: find_elements_by_xpath(" .//*[@id='kw']")  
    find_elements_by_css_selector()           如: find_elements_by_css_selector("#kw")
    使用場景:
    a.批量操做對象,如選中頁面上全部複選框
    b.先獲取一組對象,再在這組對象裏定位須要的的一些對象,如定位全部複選框,而後選擇最後一個
   例如:代碼以下
checkbox.htm頁面:
  1. <styletype="text/css">
  2. body{font-size:12px; font-family:Tahoma;}
  3. .checkbox{vertical-align:middle; margin-top:0;}
  4. </style>
  5. <body>
  6. <inputclass="checkbox"type="checkbox"/>元旦
  7. <inputtype="checkbox"name="test"/>聖誕節
  8. <inputtype="checkbox"name="test"/>股市
  9. <inputtype="checkbox"name="test"/>阿凡達
  10. <inputtype="checkbox"name="test"/>十月圍城
  11. <inputtype="checkbox"name="test"/>水價上調
  12. <inputtype="button"value="檢測"id="btn"/>
  13. </body>
python代碼: 
  1.    from selenium import webdriver
  2.  
  3.     dr=webdriver.Firefox()
  4.     dr.get("D:\\workspace\\pySelenium\\resources\\checkbox.htm")
  5. #使用tagname方式選擇頁面上全部tagname爲input的元素
  6. select_tagname=dr.find_elements_by_tag_name("input")
  7. #使用xpath方式選擇頁面上全部tagname爲input的元素
  8. select_xpath=dr.find_elements_by_xpath("//input[@type='checkbox']")
  9. #使用css_select方式選擇頁面上全部tagname爲input的元素
  10. select_css=dr.find_elements_by_css_selector('input[type=checkbox]')
  11. for i in select_tagname:
  12. #循環對每一個input元素進行點擊選中操做
  13. if i.get_attribute("type")=='checkbox':
  14. i.click()
  15. for j in select_xpath:
  16. #循環對每一個input元素進行點擊取消操做
  17. j.click()
  18. for k in select_css:
  19. #循環對每一個input元素進行點擊選中操做
  20. k.click()
  21. #打印出checkbox的個數
  22. print'----頁面上checkbox的個數爲:',len(select_css)
  23. #使用pop()獲取1組元素的第幾個元素
  24. select_css.pop(0).click()#第一個
  25. select_css.pop(1).click()#第二個
  26. select_css.pop().click()#最後一個
  27. select_css.pop(-1).click()#最後一個
  28. select_css.pop(-2).click()#倒數第二個
  29. dr.close()
    備註:pop():選擇一組元素 中的某一個,要注意的是:pop()和pop(-1)都表示最後一個元素
9、 多表單切換(對於有frame嵌套表單的操做)
frame頁面:
  1. <html>
  2. <body>
  3. <frameset>
  4. <h3>frame</h3>
  5. <iframeid='frameid'name='frameName'width="800"height="500"src="http://www.baidu.com"/>
  6. </frameset>
  7. </body>
  8. </html>
python代碼:
  1. dr.get("D:\\workspace\\pySelenium\\resources\\frame.htm")
  2. dr.switch_to_frame("frameid")#經過frame的id進入iframe
  3. #dr.switch_to_frame("frameName") #經過frame的name進入iframe
  4. #下面能夠對frame進行操做了
  5. dr.find_element_by_id("kw").send_keys("selenium")
  6. dr.find_element_by_id("su").click()
  7. dr.switch_to_default_content()#退出當前frame返回上一層
備註:1. switch_to_frame()默認直接取表單的id或者name屬性來切換
      2.完成當前frame表單操做後,能夠經過switch_to_default_content()方法返回上一層表單,即離的最近的switch_to_frame()方法    
      3.對於frame中沒有id和name屬性的經過下面方式進入frame(定位到frame以頁面對象傳入)
python代碼:
  1. dr.get("D:\\workspace\\pySelenium\\resources\\frame.htm")
  2.  #定位到frame頁面元素
  3.     framepath=dr.find_element_by_class_name("frameClassname")
  4.     dr.switch_to_frame(framepath)#經過frame頁面對象進入iframe
  5. #下面能夠對frame進行操做了
  6. dr.find_element_by_id("kw").send_keys("selenium")
  7. dr.find_element_by_id("su").click()
  8. dr.switch_to_default_content()#退出當前frame返回上一層
10、多窗口切換
    selenium-webdriver中使用switch_to_window()方法來切換任意窗口,經常使用方法有
          driver.current_window_handle    #獲取當前窗口句柄
      driver.window_handles            #返回全部窗口句柄到當前會話
      driver.switch_to_window()       #進入窗口,用於切換不一樣窗口
 
python代碼:    
  1. dr.get("http://www.baidu.com")
  2. current_handle=dr.current_window_handle #獲取百度首頁窗口句柄
  3. index_login=dr.find_element_by_xpath("//div[@id='u1']/a[@class='lb']")#獲取登陸按鈕對象
  4. index_login.click()#點擊登陸
  5. dr.implicitly_wait(5)
  6. dr.find_element_by_class_name("pass-reglink").click()#點擊當即註冊按鈕
  7. all_handles=dr.window_handles #獲取全部打開窗口句柄
  8. for handle in all_handles:
  9. if handle==current_handle:
  10. dr.switch_to_window(handle)
  11. '''
  12. ...對首頁窗口進行操做
  13. '''
  14. print'----首頁頁面title:',dr.title
  15. for handle in all_handles:
  16. if handle!=current_handle:
  17. dr.switch_to_window(handle)
  18. '''
  19. ...對註冊窗口進行操做
  20. '''
  21. print'----註冊頁面title:',dr.title
11、警告框處理
    webdriver中處理js生成的alert、confirm、prompt處理方法是:使用switch_to_alert()定位到alert/confirm/prompt,而後使用text、accept、dismiss、send_keys來根據須要操做。
    text:返回alert、confirm、prompt中的文字信息
    accept:點擊確認按鈕
    dismiss:點擊取消按鈕
    send_keys:在alert、confirm有對話框時輸入值
python代碼:
  1. dr.get("http://www.baidu.com")
  2. set_link=dr.find_element_by_xpath("//div[@id='u1']/a[@class='pf']")#找到設置連接元素
  3. ActionChains(dr).move_to_element(set_link).perform()#鼠標移動到設置上
  4. dr.find_element_by_xpath("//a[@class='setpref']").click()#點擊搜索設置連接
  5. time.sleep(3)    #加等待時間 等按鈕可用,不然會報錯
  6. save_set=dr.find_element_by_css_selector("#gxszButton > a.prefpanelgo")#獲取保存設置按鈕
  7. save_set.click()#點擊保存設置按鈕
  8.  
  9. alert=dr.switch_to_alert()                    #進入alert
  10. print'----彈出alert中內容爲:',alert.text #打印對話框裏的文字內容
  11. alert.accept()#對話框裏點擊alert中肯定按鈕
  12. #alert.dismiss() #對話框裏點擊取消按鈕
  13. #alert.send_keys("對話框中輸入的內容") #在對話框裏輸入內容
12、上傳文件
    分2種:普通上傳、插件上傳
    普通上傳:將本地文件的路徑做爲一個值放到input標籤中,經過form表單提交時,將值傳給服務器中去
    插件上傳:指基於flash、javascript或ajax技術實現的上傳功能或插件。
    1.針對普通上傳用send_keys實現
python代碼:
  1. dr.get("D:\\workspace\\pySelenium\\resources\\upload.htm")
  2. loadFile=dr.find_element_by_name("filebutton")# 獲取上傳文件input元素節點
  3. loadFile.send_keys("D:\\workspace\\pySelenium\\resources\\frame.htm")#輸入上傳文件地址來實現上傳
    2.插件上傳:使用AutoIt實現,--須要安裝AutoIt程序
        AutoIt安裝,使用暫時略,須要時再追加,流程爲:用AutoIt編寫上傳文件腳本生成exe文件,在python腳本中進行調用
python代碼:
  1. loadFile=dr.find_element_by_name("filebutton")# 獲取上傳按鈕
  2. loadFile.click()    #點擊上傳按鈕,彈出上傳對話框
  3. os.system("D:\\autoItFile.exe")    #調用autoIt生成的exe文件,實現導入
十3、下載文件:使用AutoIt實現,--須要安裝AutoIt程序,方法同上傳
python代碼:
  1. ffp=webdriver.FirefoxProfile()
  2. ffp.set_preference("browser.download.folderList",2)#0:表明下載到瀏覽器默認路徑下;2:下載到指定目錄
  3. ffp.set_preference("browser.download.manager.showWhenStarting",False)#是否顯示開始:True:顯示;False:不顯示
  4. ffp.set_preference("browser.download.dir", os.getcwd())#指定下載文件目錄,os.getcwd()無參數,返回當前目錄
  5. # ffp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/octet-stream")#下載文件類型,
  6. #指定下載頁面的content-type值,application/octet-stream爲文件類型,http-content-type經常使用對照表搜索百度
  7. dr=webdriver.Firefox(firefox_profile=ffp)
  8. dr.get("https://pypi.python.org/pypi/selenium#downloads")
  9. dr.find_element_by_xpath("//div[@id='content']/div[3]/table/tbody/tr[3]/td[1]/span/a[1]").click()
  10. #接下來使用autoIt實現
十4、cookies操做
    webdriver操做cookies的方法:
    get_cookies():得到全部cookies的值
    get_cookie(name):得到有特定name值的cookie信息
    add_cookie(cookie_dict):添加cookie,必須有name和value
    delete_cookie(name):刪除特定名稱的cookie信息,經過name找到特定的cookie並刪除
    delete_all_cookies():刪除瀏覽器中全部cookie的信息
    注意:1.cookie是以字典形式進行存儲的;
    2.使用場景:如登陸功能會把用戶名寫入瀏覽器cookie指定key爲username,那麼就能夠經過get_cookies()找到username,打印value,找不到說明保存瀏覽器的cookie是有bug的。
python代碼:
  1. num=1
  2. dr.get("http://www.baidu.com")
  3. cookies=dr.get_cookies()#獲取cookie的全部信息
  4. for ck in cookies:
  5. print'----全部cookie',num,':',ck #打印cookie的全部信息
  6. num=num+1
  7. print'----按name查cookie:',dr.get_cookie("PSTM")#經過cookie的name獲取cookie信息
  8. dr.add_cookie({'name':'hello','value':'123456789'})#向name和value添加會話信息
  9. cookies2=dr.get_cookies()#從新獲取cookie的全部信息
  10. for ck2 in cookies2:
  11. if ck2['name']=='hello':
  12. print"----加入的cookie信息:%s-->%s",(ck2['name'],ck2['value'])
十5、javascript調用,python使用的方法:execute_script()
python代碼:
  1. dr.get("http://www.baidu.com")
  2. dr.find_element_by_id("kw").send_keys("selenium")
  3. dr.find_element_by_id("su").click()
  4. js="var q=document.documentElement.scrollTop=1000"    #滾動條滾到最下面
  5. dr.execute_script(js)
  6. time.sleep(4)
  7. js2="var q=document.documentElement.scrollTop=0"      #滾動條滾到頁面頂
  8. dr.execute_script(js2)
十6、截圖,適用於腳本出錯時,對當前窗口進行截圖保存,使用函數:get_screenshot_as_file()
python代碼:
  1. dr.get("http://www.baidu.com")
  2. try:
  3. dr.find_element_by_id("kw1").send_keys("selenium")
  4. dr.find_element_by_id("su").click()
  5. exceptNoSuchElementException,msg:
  6. dr.get_screenshot_as_file("d:\\error.jpg")    #截圖輸出到d盤
  7. print msg
  8. dr.close()
十7、關閉窗口
    quit():退出相關驅動程序並關閉全部窗口。
    close():關閉當前窗口,打給多個窗口時,可以使用來關閉當前窗口
十8、驗證碼處理
    方法1:去掉驗證碼,問題:若是是在正式環境跑腳本那麼在取掉會存在風險
    方法2:設置萬能驗證碼,不須要取消驗證碼,在程序中留後門--設置一個萬能驗證碼,輸入萬能驗證碼了就標識經過
python代碼: 
  1. import random
  2. randnum=random.randint(1000,9999)
  3. print"----生成隨機數爲:",randnum
  4. input_num=input(u"請輸入驗證碼:")
  5. print"----輸入驗證碼爲:",input_num
  6. if input_num==randnum:
  7. print"隨機數正確,登陸成功"
  8. elif input_num==1234:
  9. print"輸入正確,登陸成功"
  10. else:
  11. print"登陸失敗"
    方法3:使用cookie方法獲取,讀取以前登陸的cookie值訪問時,直接登陸,不須要驗證碼



相關文章
相關標籤/搜索