本篇學習總結webdriver模塊操做瀏覽器、Cookie、鼠標鍵盤、警示框、設置等待時間、多窗口切換等方法的使用python
Selenium-webdriverAPI提供了對頁面元素定位和操做方法外,還提供了對瀏覽器自己的操做,如瀏覽器前進、後退、刷新、關閉、瀏覽器窗口大小設置等web
Selenium-webdriverAPI對瀏覽器窗口設置提供了set_window_size(width,height)方法,第一個參數爲寬度,第二個參數爲高度。如將瀏覽器窗口設置成移動客戶端的大小480*800,腳本爲:windows
driver. set_window_size(480,800)瀏覽器
固然通常咱們都但願打開瀏覽器後最大化窗口,Selenium-webdriverAPI也提供了窗口最大化的方法cookie
maximize_window()學習
有時咱們常常操做瀏覽器頁面前進、後退以及關閉等操做,Selenium-webdriverAPI提供了對應的forword()、back()、quit()、close()方法測試
其中quit()、close()方法,不一樣的是quit()方法表示退出整個瀏覽器驅動,close()表示退出當前的瀏覽器窗口網站
Selenium-webdriverAPI提供刷新瀏覽器頁面的方法爲refresh()ui
具體的各個方法使用,以下面新建的browser.py腳本實例:spa
1 ''' 2 Code description: 3 Create time: 4 Developer: 5 ''' 6 # -*- coding: utf-8 -*- 7 from selenium import webdriver 8 import time 9 driver = webdriver.Ie() 10 driver.get('https://www.baidu.com') 11 driver.maximize_window() # 最大化窗口 12 time.sleep(5) 13 driver.set_window_size(480,800) # 設置窗口大小 14 driver.back() # 瀏覽器後退 15 driver.forward() # 瀏覽器前進 16 time.sleep(5) 17 driver.refresh() # 瀏覽器刷新 18 driver.quit() # 瀏覽器退出 19 # driver.close() # 關閉當前打開的瀏覽器頁面
Webdriver提供了多種操做瀏覽器cookie的方法,主要以下:
get_cookies()
該方法會獲取瀏覽器全部的cookie信息,cookie信息數據類型以字典的形式存放,即key-value對的形式
get_cookie(name)
該方法會獲取cookie數據中屬性鍵值name的值的cookie信息,其餘鍵值數據信息不獲取
add_cookie(cookie_dict)
該方法爲添加cookie,因爲咱們知道cookie存放數據是以字典的形式,故添加cookie時必須是鍵值對形式
delete_cookie(cookie_dict)
該方法爲刪除cookie,與add對應
delete_all_cookies()
該方法爲刪除全部的瀏覽器cookie信息
具體方法使用以下圖,新建cookie.py的腳本,仍是以baidu.com爲例子
1 ''' 2 Code description: 3 Create time: 4 Developer: 5 ''' 6 # -*- coding: utf-8 -*- 7 from selenium import webdriver 8 driver = webdriver.Ie() 9 driver.get('https://www.baidu.com/') 10 cookie = driver.get_cookies() # 獲取全部的cookie,cookie數據以字典的形式存放 11 print(cookie) 12 print(driver.get_cookie('BAIDUID')) # get_cookie(name)方法用來獲取cookie鍵值name對應的值 13 driver.add_cookie({'name': 'hello','value' : 'world'}) # 添加cookie 14 for cookie in driver.get_cookies(): 15 print(driver.get_cookie('hello')) 16 driver.delete_cookie('hello') # 刪除指定的cookie 17 # driver.delete_all_cookies() # 刪除全部的cookie 18 driver.quit()
在瀏覽網頁是電腦和咱們交互的就是鼠標和鍵盤了,也是咱們操做最多的。鼠標在如今的網頁上已經有諸多操做,如單擊、右擊、雙擊、懸浮、拖拽等操做;鍵盤用於輸入,有諸多輸入鍵,如enter、backspace、空格等以及諸多組合鍵的使用。Webdriver對於鼠標和鍵盤也實現了比較多和詳細的模擬實現方式,主要由webdriver中封裝的ActionChains類實現。
對於鼠標的操做,ActionChains類主要提供了鼠標的右鍵、雙擊、懸浮、拖拽等方法
具體的方法以下:
下面以百度網盤網頁客戶端來講明模擬鼠標的這些操做方法,以下圖選中一個文件夾後能夠鼠標右鍵後有操做列表顯示:
模擬實現鼠標右鍵操做來打開該文件夾,代碼以下:
1 ''' 2 Code description: 3 Create time: 4 Developer: 5 ''' 6 # -*- coding: utf-8 -*- 7 from selenium import webdriver 8 from selenium.webdriver.common.action_chains import ActionChains 9 driver = webdriver.Ie() 10 driver.get('https://pan.baidu.com') 11 ''' 12 中間省略百度網盤的登錄過程腳本 13 ''' 14 # 定位到PyCharm這個元素位置 15 PyCharm = driver.find_element_by_xpath('//*[@id="layoutMain"]/div/div[2]/div/div[3]/div/div/dd/div[2]/div[1]') 16 ActionChains(driver).context_click(PyCharm).perform() 17 ''' 18 調用ActionChains()方法,傳入driver瀏覽器參數,類提供的鼠標右擊操做方法context_click(),傳入須要右擊的元素PyCharm,最後 19 perform()方法爲整個右擊動做的提交 20 ''' 21 driver.quit()
一樣,上面的PyCharm文件夾,咱們也能夠雙擊鼠標來打開該文件,雙擊操做以下:
ActionChains(driver).double_click(PyCharm).perform()
鼠標懸浮操做,如將鼠標移動到網盤的帳號處,會顯示該帳號的信息,以下圖:
實現方法爲move_to_element()以下:
user = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span') # 定位到網盤帳戶位置 ActionChains(driver).move_to_element(user).perform()
鼠標拖拽操做的沒找到合適的網站,使用方法大體以下:
pesition1 = driver.find_element_by_xpath('//*[@id="layoutHeader"]') # 定位元素A的位置 pesition2 = driver.find_element_by_xpath('//*[@id="layoutHeader"]/div/div/dl/dd[2]/span') # 定位元素B的位置 ActionChains(driver).drag_and_drop(pesition1,pesition2).perform() # 進行拖拽操做
拖拽方法爲drag_and_drop(參數1,參數2),參數1爲定位到的須要拖拽的元素,參數2爲定位到拖拽後的位置
以前咱們已經使用過鍵盤輸入的方法send_keys(),可是若是咱們須要操做更多的鍵如回車、回格,ctrl、shift以及各類組合鍵,這時咱們須要引入webdriver下面提供的keys類模塊。
經常使用的鍵盤操做有:enter、backspace、ctrl+c、ctrl+v、F5等,keys模塊都是有方法的
如模擬backspace鍵,打開百度,輸入Python3,而後在Backspace去掉3這個數字,再百度搜索:
1 ''' 2 Code description: 3 Create time: 4 Developer: 5 ''' 6 # -*- coding: utf-8 -*- 7 from selenium import webdriver 8 from selenium.webdriver.common.keys import Keys 9 driver = webdriver.Ie() 10 driver.get('https://www.baidu.com/') 11 baidu = driver.find_element_by_id('kw') # 定位到百度搜索框 12 baidu.send_keys('Python3') 13 baidu.send_keys(Keys.BACK_SPACE) # 使用Keys.BACK_SPACE來模擬Backspace鍵其它
其它操做鍵盤的方法就不列舉了,能夠本身練習下,在導入Keys模塊後就能夠調用模塊下全部封裝好的方法:
如今幾乎不少軟件都會嵌入各類警示框,好比登錄驗證出錯會彈出警示框。對於這些彈出的警示框,webdriver也是提供了專門的方法,來處理這類軟件警示框。
Webdriver經過switch_to.alert()方法來定位到警示框,並提供了以下對警示框的操做方法:
好比以下一個登陸頁面,當輸入不對的帳號或者密碼時,會彈出警示框
下面看看這些處理警示框的方法使用:
username = driver.find_element_by_id('loginUserName') username.send_keys('123') password = driver.find_element_by_id('loginPassWord') password.send_keys('123') button_login = driver.find_element_by_id('loginBtn') button_login.click() alter = driver.switch_to_alert() # 獲取警示框 alter.text # 獲取警示框文本信息 alter.accept() # 確認警示框 alter.dismiss() # 取消確認 alter.send_keys() # 輸入值,若是警示框有輸入框
注意selenium如今的方法爲:switch_to.alert()
有時咱們須要打開多個瀏覽器窗口進行窗口切換,操做不一樣窗口,因爲selenium-webdrvier只能在一個窗口中識別元素和對元素進行操做,若是想要操做另一個窗口,就必須進行窗口切換。對此,webdriver也提供了這種多窗口切換的場景的實現方法。因爲每一個打開的窗口句柄是不一樣的,這樣webdriver經過窗口句柄實現窗口切換。具體方法以下:
以下腳本以登陸百度首頁,並打開另外一個窗口進入到註冊頁面,而後卻換窗口到百度首頁,進行搜索爲例說明以上方法使用:
1 ''' 2 Code description: 3 Create time: 4 Developer: 5 ''' 6 # -*- coding: utf-8 -*- 7 from selenium import webdriver 8 driver = webdriver.Ie() 9 driver.get('https://www.baidu.com/') 10 driver.maximize_window() 11 sreach_windows = driver.current_window_handle # 獲取當前百度搜索窗口的句柄,是一個字符串 12 print(sreach_windows) 13 driver.find_element_by_link_text(u'登陸').click() 14 driver.find_element_by_link_text(u'當即註冊').click() 15 all_handles = driver.window_handles # 獲得搜索頁面和註冊頁面全部的窗口句柄,返回的是一個列表 16 print(all_handles) 17 # 進入到註冊窗口 18 for handle in all_handles: 19 if handle != sreach_windows: 20 driver.switch_to.window(handle) # 切換到指定窗口 21 print("如今進入的是註冊窗口") 22 driver.find_element_by_name('userName').send_keys('123') 23 # 切換到搜索窗口 24 for handle in all_handles: 25 if handle == sreach_windows: 26 driver.switch_to.window(handle) # 切換到指定窗口 27 print("如今進入的是搜索窗口") 28 driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click() # 關閉註冊窗口 29 driver.find_element_by_id('kw').send_keys('python') 30 driver.find_element_by_id('su').click() 31
在測試過程當中,咱們編寫的腳本每每很快執行完成,爲了觀察一些重要步驟的執行效果,咱們能夠在腳本中添加執行等待時間或者咱們須要定位的元素頁面短期無法加載出來時,此時若是沒有設置等待時間,腳本執行就會出錯:元素不存在,這時咱們設置等待時間就很是有必要了。對此,selenium-webdriver提供了Explicit Waits(顯示等待)和Implicit Waits(隱性等待)兩種模式的等待時間設置,另外python標準庫模塊time也提供了一種非智能的sleep()等待時間模式。
Python標準庫模塊time提供強制等待設置,方法爲sleep(),就是腳本執行過程當中設置強制暫停腳本運行的時間間隔
設置隱性等待時間,由webdriver提供。隱性等待時間就是設置一個時間範圍,有個最大響應時間,超時將會拋出異常。以下腳本,驅動打開IE瀏覽器,咱們設置了最大打開等待時間是10s,也就是說可能2s時ie就開啓,若是超過10s就會拋出異常。使用方法爲:
driver.implicitly_wait(10)
設置顯示等待時間,由webdriver下的WebDriverWait模塊提供。WebDriverWait()會配合until()和until_not()方法一塊兒使用,根據判斷條件而進行靈活進行處理時間等待問題,他會不斷的根據你設定的條件去判斷,直到超過你設置的等待時間,若是設置的條件知足,而後進行下一步操做,若是沒有知足會報一個'selenium.common.exceptions.TimeoutException: Message: '錯誤。
以下腳本設置用戶名輸入框顯示等待時間,並輪訓判斷該元素是否存在,若是判斷在設置時間內沒有則拋出異常:,以下使用方式: