ES6的一些小知識
selenium簡介
selenium 是一個用於Web應用程式測試的工具。Selenium測試直接執行在瀏覽器中,就像真正的使用者在操作一樣。支援的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。這個工具的主要功能包括:測試與瀏覽器的相容性——測試你的應用程式看是否能夠很好得工作在不同瀏覽器和作業系統之上。測試系統功能——建立迴歸測試檢驗軟體功能和使用者需求。支援自動錄製動作和自動生成 .Net、Java、Perl等不同語言的測試指令碼。
selenium可以用於爬蟲,用於爬蟲的目的是繞過大多數js加密和js渲染問題
selenium和requests的區別
requests是向伺服器傳送請求後,對返回的網頁原始碼進行解析,對於ajax載入需要更深的功力,大多數網站會通過JS來做反爬
selenium是模仿操作瀏覽器開啟頁面,並對F12內的網頁程式碼進行解析------>比requests更粗暴,你網頁上顯示啥,就能獲取啥資料
selenium庫的安裝
第一步:安裝selenium模組包
pip install selenium 或者setting裡面安裝,裝不上就掛映象
第二步:下載瀏覽器驅動 ------> 我是谷歌,所以下載的是Chromedriver
地址:http://chromedriver.storage.googleapis.com/index.html
注意使用的瀏覽器版本和驅動要對應,或者最接近的一個
將下載的驅動解壓後,放置在python目錄下Scripts資料夾內(和pip一個路徑),如果沒有放置在這裡,那麼每次呼叫需要寫明驅動所在絕對路徑。
第三步:檢查確認上述均為成功步驟
新建專案鍵入如下程式碼
1 from selenium import webdriver 2 driver = webdriver.Chrome()
如果能自動彈出一個瀏覽器視窗,並顯示瀏覽器被自動化軟體控制,即成功。
selenium的基本使用方法
匯入模組,一般是匯入webdriver模組,用於呼叫瀏覽器驅動,控制瀏覽器
from selenium import webdriver
開啟瀏覽器,用變數driver儲存該程式控制代碼,以方便呼叫
driver = webdriver.Chrome()
開啟網頁,比如開啟百度
driver.get(url='www.baidu.com')
關閉頁面
# 關閉瀏覽器 driver.quit() # 關閉當前選項卡 driver.close()
selenium中的元素定位
selenium是解析F12的網頁程式碼,是經過JS渲染的,那麼從中尋找我們需要的目標,是我們必須掌握的內容,如何定位到元素?
# 在其中通過id定位()內參數為目標標籤的id值 driver.find_element_by_id()
# 在其中通過name定位,()內參數為目標標籤的name值 driver.find_element_by_name()
# 在其中通過class name定位,()內參數為目標標籤的class值 driver.find_element_by_class_name()
# 在其中通過tag_name定位,()內參數為目標標籤的標籤名 driver.find_element_by_tag_name()
# 在其中通過超連結文字定位,()內參數為目標連結的文字--->精確文字才能定位 driver.find_element_by_link_text()
# 在其中通過超連結文字定位,()內參數為目標連結的文字--->模糊文字即可定位 driver.find_element_by_partial_link_text()
# 在其中通過xpath定位,()內參數為目標標籤的xpath路徑 driver.find_element_by_xpath()
# 在其中通過css_selector定位,()內參數為目標標籤的css_selectors值 driver.find_element_by_css_selector()
上述方法中element單詞是單數,所以他找到第一個目標後,就不找了,如果要找到多個,就把他改成複數elements,返回也會變成一個列表
一般情況下,我們都是通過標籤定位,然後獲取文字內容,同樣,我們也可以反向操作,通過文字內容來定位標籤
# 精確定位 下例中'文字內容'按照實際情況修改 driver.find_element_by_xpath("//*[text()='文字內容']")
# 模糊定位 下例中'文字內容'按照實際情況修改,文字可以只有一部分 driver.find_element_by_xpath("//*[contains(text(),'文字內容')]")
selenium元素定位後的使用
使用是肯定要用的,比如定位到輸入框,怎麼輸入文字,定位到確定按鈕,怎麼按下去?
常見的就是輸入和點選
輸入
# 定位到input輸入框 inp = driver.find_element_by_xpath('//input')
這時候,我們把input輸入框位置的控制代碼儲存為inp變數
inp.send_keys('輸入的內容')
send_keys就是向某個標籤傳送資料,往input框傳送資料,就是在輸入框中填寫內容
點選
# 定位到一個button按鈕 btn = driver.find_element_by_xpath('//button')
btn.click()
注意,這裡不一定非得定位到button按鈕才能點選,只要你在解析網站的時候,你所選的目標標籤可以被點選就行.
總結:首先要獲取目標標籤位置,然後在進行方法操作,元素定位是最重要的。
視窗切換
用selenium操作瀏覽器如果需要再開啟新的介面,這個時候會有問題,因為我們用selenium操作的是第一個開啟的視窗,所以新開啟的頁面我們是無法去操作的,所以我們要用到切換視窗,即handle切換方法:
js = 'window.open("https://www.baidu.com")' #開啟新標籤 chrome.execute_script(js) #執行語句 window_handles #獲取所有頁面視窗的控制代碼 current_window_handle #獲取當前頁面視窗的控制代碼 switch_to.window(window_name) #定位頁面轉到指定的window_name的頁面
widow_handles的順序並不是瀏覽器上標籤的順序,儘量避免多標籤的操作
頁面frame切換
在實際用selenium爬蟲的過程中,明明定位的路徑沒有問題,卻找不到元素,這時候可以考慮一下該頁面是否存在frame的問題導致定位不到元素.
# 方法 作用 switch_to.frame(frame_local) #切到指定frame,可用id活name(str)、index(int)、元素(WebElement)定位 switch_to.parent_frame() #切到父級frame,如果已經是主文件,則無效果,相當於後退回去 switch_to_default_content() #切換到主頁面,DOM樹最開始的frame
頁面彈窗
有時候會遇到彈窗的問題,主要有兩種型別的彈窗(alert/prompt),一種是自定義彈窗,即一個自定義的div層,是隱藏頁面中的,當觸發了這個彈窗,它就顯示出來,這種方式我們通過正常定位即可得到.
alert彈窗則通過下面方法處理:
#方法 作用 switch_to_alert #定位到alert彈窗,返回一個彈窗物件 dismiss() #對彈窗物件的取消操作 accept() #對彈窗物件的確定操作 send_keys(key) #在彈窗物件內的輸入框輸入資料 text #獲取彈窗文字
動作鏈
在selenium中除了點選動作外,還有一些稍微複雜的動作,就需要用到ActionChains這個子模組來滿足我們的需求.
ActionChains可以完成複雜的頁面互動行為,例如元素的拖拽,滑鼠移動,懸停行為,內容選單互動.
他的執行原理就是當呼叫ActionChains方法的時候不會立即執行,而是將所有的操作暫時儲存在一個佇列中,當呼叫perform()方法的時候,會按照佇列中放入的先後順序執行前面的操作.
匯入的方法:
from selenium.webdriver import ActionChains
# ActionChains提供的方法及作用
click(on_element=None) #滑鼠左鍵單擊傳入的元素
double_click(on_element=None) #雙擊滑鼠左鍵
context_click(on_element=None) #點選滑鼠右鍵
click_and_hold(on_element=None) #點選滑鼠左鍵,按住不放
release(on_element=None) #在某個元素位置鬆開滑鼠左鍵
drag_and_drop(source,target) #拖拽到某個元素然後鬆開
drag_and_drop_by_offset(source,xoffset,yoffset) #拖拽到某個座標,然後鬆開
move_to_element(to_element) #滑鼠移動到某個元素
move_by_offset(xoffset,yoffset) #移動滑鼠到指定的x,y位置
move_to_element_with_offset(to_element,xoffset,yoffset) #將滑鼠移動到距某個元素多少距離的位置
perform() #執行鏈中的所有動作
另外,我還總結了一些關於selenium的一些小技巧如下:
#方法 說明 Chrome.refresh() #重新整理頁面 Chrome.page_souce #網頁原始碼 Chrome.cookies #本業儲存的cookie Chrome.maximize_window() #最大化視窗
以上就是對selenium目前的全部總結.