1. 程式人生 > >筆記-爬蟲-selenium常用方法

筆記-爬蟲-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()