WebDriver的原理:javascript
webdriver是按照server-client的經典設計模式設計的。css
server端就是remote server,能夠是任意的瀏覽器。當咱們的腳本啓動瀏覽器後,該瀏覽器就是remote server,它的職責就是等待client發送請求並做出響應。java
client就是咱們的測試代碼。咱們測試代碼的一些行爲,例如打開瀏覽器,跳轉到特定的url等操做是以http請求的方式發送給被測試瀏覽器的,也就是remote server。remote server接受請求,執行相應操做,並在response中返回執行狀態、返回值等信息。web
webdriver的工做流程:chrome
a.webdriver啓動目標瀏覽器,並綁定到指定端口。啓動的瀏覽器實例將做爲webdriver的Remote server,windows
b.client端經過CommandExcuter發送HttpRequest給remote server的偵聽端口設計模式
c.remote server須要依賴原生的瀏覽器組件(如chromedriver.exe)來轉化瀏覽器的native調用瀏覽器
一 元素定位cookie
二 常見使用ide
1.操做瀏覽器
from selenium import webdriver dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') dr.close()
from selenium import webdriver driver = webdriver.Chrome("D:/soft/chromedriver.exe") first_url = 'https://www.baidu.com/' print("now access %s"%first_url) driver.get(first_url) second_url = 'http://news.baidu.com/' print("now access %s"%second_url) driver.get(second_url) print("back to %s"%first_url) driver.back() print("forward to %s"%second_url) driver.forward() driver.quit()
from selenium import webdriver dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') dr.refresh() # 模擬瀏覽器刷新 dr.quit()
2.簡單元素操做
from selenium import webdriver driver = webdriver.Chrome("D:/soft/chromedriver.exe") driver.get("http://126.com/") driver.maximize_window() driver.find_element_by_css_selector('.u-login-entry').click() driver.switch_to.frame(0) driver.find_element_by_css_selector('.j-nameforslide').send_keys('wmm_0165') # 模擬鍵盤像輸入框輸入內容 driver.find_element_by_css_selector('input[name=email]').clear() # 清楚文本輸入得內容 driver.quit()
from selenium import webdriver dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') size = dr.find_element_by_css_selector('input[name=wd]').size # 獲取輸入框的尺寸 print(size) text = dr.find_element_by_css_selector('p:nth-of-type(5)>a').text print(text) type = dr.find_element_by_css_selector('input[id=su]').get_attribute('type') # 獲取元素的屬性值 print(type) result = dr.find_element_by_css_selector('input[id=su]').is_displayed() # 元素結果是否可見,返回False或True print(result) 輸出結果: {'height': 22, 'width': 526} 使用百度前必讀 submit True
3.鼠標事件
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') shurukuang = dr.find_element_by_css_selector('input[name=wd]') ActionChains(dr).context_click(shurukuang).perform() # 鼠標右擊 ActionChains(dr).move_to_element(shurukuang).perform() # 鼠標懸停 ActionChains(dr).double_click(shurukuang).perform() # 鼠標雙擊 # ActionChains(dr).drag_and_drop(source,target).perform() # 鼠標拖放
4.鍵盤事件
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') dr.find_element_by_css_selector('input[name=wd]').send_keys('seleniumm') # 輸入框輸入內容 dr.find_element_by_css_selector('input[name=wd]').send_keys(Keys.BACK_SPACE) # 刪除多輸入的一個m time.sleep(2) dr.find_element_by_id('su').send_keys(Keys.ENTER) # 經過回車鍵來代替單擊操做 dr.quit()
5.得到驗證信息
from selenium import webdriver dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') print(dr.title) # 獲取當前頁面標題 print(dr.current_url) # 獲取當前頁面url dr.quit() 輸出結果: 百度一下,你就知道 https://www.baidu.com/
6.設置元素等待
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') element = WebDriverWait(dr, 5, 0.5).until(EC.presence_of_element_located(("css selector", 'input[name=wd]'))) # ignored_exceptions 超時後的異常信息 dr.quit()
7.定位一組元素
8.多表單切換
""" webdriver只能在一個頁面上對元素識別與定位,對於frame/iframe表單內嵌頁面上的元素沒法直接定位。 這時就須要經過switch_to.frame()方法將當前定位的主體切換爲frame/iframe表單的內嵌頁面中 """ from selenium import webdriver driver = webdriver.Chrome("D:/soft/chromedriver.exe") driver.get("http://126.com/") driver.maximize_window() driver.find_element_by_css_selector('.u-login-entry').click() dingwei = driver.find_element_by_css_selector('div#loginDiv>iframe') driver.switch_to.frame(dingwei) # switch_to.frame()默承認以直接獲取表單的id或name屬性。若是沒有可用給的id和name屬性,咱們能夠自行定位,再將定位對象傳遞給switch_to.frame()方法 # driver.switch_to.frame(0) driver.find_element_by_css_selector('.j-nameforslide').send_keys('wmm_0165') # 模擬鍵盤像輸入框輸入內容 driver.find_element_by_css_selector('input[name=email]').clear() # 清楚文本輸入得內容 driver.quit()
9.多窗口切換
""" 在頁面操做過程當中有時候點擊某個連接會彈出新的窗口,這時就須要主機切換到新打開的窗口上進行操做 """ from selenium import webdriver import time dr = webdriver.Chrome("D:/soft/chromedriver.exe") dr.maximize_window() dr.get('https://www.baidu.com') search_windows = dr.current_window_handle # 獲取當前窗口句柄 dr.find_element_by_css_selector('div#u1>a[name=tj_login]').click() # 點擊登陸 time.sleep(2) dr.find_element_by_css_selector('.tang-pass-footerBarPhoenix+a').click() # 點擊當即註冊 all_handles = dr.window_handles # 獲取當前全部打開的窗口的句柄 # 進入註冊窗口 for handle in all_handles: if handle != search_windows: dr.switch_to.window(handle) # 切換到相應的窗口 print('now register window!') time.sleep(2) # 回到搜索窗口 for handle in all_handles: if handle == search_windows: dr.switch_to.window(handle) print('now search window!') time.sleep(2) dr.quit() 輸出結果: now register window! now search window!
10.警告框處理
11.上傳文件
12.下載文件
13.操做cookie
14.調用javascript
15.關閉窗口
driver.quit():退出相關的驅動程序和關閉全部窗口
driver.close():關閉當前窗口