筆記-爬蟲-selenium常用方法
筆記-爬蟲-selenium常用方法
1. 查詢元素
常用的查詢方法
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
也可以使用通用的方法
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(BY.ID,'q')#第一個引數傳入名稱,第二個傳入具體的引數
print(input_first)
browser.close()
查詢多個元素,elements多個s
input_first = browser.find_elements_by_id('q')
2. 互動操作
2.1. 操作瀏覽器
方法 |
說明 |
set_window_size() |
設定瀏覽器的大小 |
back() |
控制瀏覽器後退 |
forward() |
控制瀏覽器前進 |
refresh() |
重新整理當前頁面 |
submit() |
用於提交表單 |
close() |
關閉單個視窗 |
quit() |
關閉所有視窗 |
get_screenshot_as_file(self, filename) |
用於擷取當前視窗,並把圖片儲存到本地 |
driver.switchTo().window("windowName") |
在Windows之間移動 |
driver.switchTo().frame("frameName"); |
在 frame 之間移動 |
注:frame相當於獨立的網頁,如果在父類網frame查詢子類的,則必須切換到子類的frame,子類如果查詢父類也需要先切換
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
2.2. 元素操作
clear() |
清除文字 |
send_keys(*value) |
模擬按鍵輸入/賦值 |
click() |
單擊元素 |
current_url |
獲取當前頁面url |
location |
元素座標 |
get_attribute(element_name) |
獲取元素屬性值 |
is_selected() |
|
size |
元素大小 |
is_displayed() |
|
is_enabled() |
|
text |
元素文字值 |
tagName |
元素的tagName |
2.3. 滑鼠操作
這個需要使用webdriver下的ActionChains類,這個類是操作滑鼠操作的:
from selenium.webdriver import ActionChains
滑鼠操作可分為三類:滑鼠移動、滑鼠拖拽、滑鼠點選
element = driver.find_element_by_name('tj_settingicon')
#滑鼠點選
ActionChains(driver).click(element).perform() #單擊某元素
ActionChains(driver).click_and_hold(element).perform() #在此元素上按下左鍵不放
ActionChains(driver).context_click(element).perform() #在此元素上單擊右鍵
ActionChains(driver).double_click(element).perform() #在此元素上雙擊
#滑鼠拖拽
ActionChains(driver).drag_and_drop(source,target).perform() #從一個元素的位置,拖至另一個元素位置鬆開
ActionChains(driver).drag_and_drop_by_offset(source,xoffset,yoffset) #以座標的形式拖拽,x,y
#滑鼠移動
ActionChains(driver).move_by_offset(x,y) #移動到(x,y)座標位置
ActionChains(driver).move_to_element(element) #滑鼠移動到某個元素上
ActionChains(driver).move_to_element_with_offset(element,x,y) #移動到某個元素上,然後,在移動到相對座標(x,y)上
2.4. 執行JavaScript
有些動作可能沒有提供api,比如進度條下拉,這時,我們可以通過程式碼執行JavaScript。
webdriver 提供了 execute_script() 介面用來呼叫 js 程式碼。
執行 JS 一般有兩種場景:
1:一種是在頁面上直接執行 JS
2:另一種是在某個已經定位的元素上執行 JS
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
2.5. 等待
隱式等待
當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則丟擲找不到元素的異常,
換句話說,當查詢元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查詢 DOM,預設的時間是0
browser.implicitly_wait(10)#等待十秒載入不出來就會丟擲異常,10秒內加載出來正常返回
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
顯式等待
指定一個等待條件,和一個最長等待時間,程式會判斷在等待時間內條件是否滿足,如果滿足則返回,如果不滿足會繼續等待,超過時間就會丟擲異常
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)
until()
WebDriverWait()一般由until()(或until_not())方法配合使用,下面是until()和until_not()方法的說明。
until(method, message=’ ’)
呼叫該方法提供的驅動程式作為一個引數,直到返回值為Ture。
until_not(method, message=’ ’)
呼叫該方法提供的驅動程式作為一個引數,直到返回值為False。
Expected Conditions
在本例中,我們在使用expected_conditions 類時對其時行了重新命名,通過as 關鍵字對其重新命名為EC,
並呼叫presence_of_element_located()判斷元素是否存在。
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 預期一個警告資訊
除了expected_conditions 所提供的預期方法,我們也可以使用前面學過的is_displayed()方法來判斷元素是否可。
2.6. Cookies
driver.get_cookies() |
|
driver.get_cookies() |
|
delete_all_cookies() |
|
delete_cookie(name) |
|
add_cookie(cookie_dict) |
新增 cookie,必須有 name 和 value 值 |
2.7. 異常處理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('Time Out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('No Element')
finally:
browser.close()