Selenium 是什麼?一句話,自動化測試工具。它支持各種瀏覽器,包括 Chrome,Safari,Firefox 等主流界面式瀏覽器,如果你在這些瀏覽器裏面安裝一個 Selenium 的插件,那麼便可以方便地實現Web界面的測試。換句話說叫 Selenium 支持這些瀏覽器驅動
Selenium支持多種語言開發,比如 Java,C,Ruby,Python等等
#一個簡單的小例子 from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() #打開Chrom瀏覽器 browser.get('http://www.baidu.com') #輸入百度的網址 即打開百度 input = browser.find_element_by_id('kw') #找到id=kw 即百度搜索輸入框 #input = browser.find_element(By.ID,'kw') #同上 input.send_keys('Python') #在搜索輸入框中輸入Python input.send_keys(Keys.ENTER) #鍵入回車
#用例: 聲明瀏覽器對象
#未安裝則報錯
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
查找元素
WebDriver 提供了許多尋找網頁元素的方法,譬如 find_element_by_* 的方法。例如一個輸入框可以通過 find_element_by_name 方法尋找 name 屬性來確定。
對應於webdriver中的定位方法分別是: driver.find_element_by_name() ——最常用,簡單 driver.find_element_by_id() ——最常用,簡單 driver.find_element_by_class_name() driver.find_element_by_tag_name() ——最不靠譜 driver.find_element_by_link_text() ——定位文字連接好用 driver.find_element_by_partial_link_text() ——定位文字連接好用 driver.find_element_by_xpath() ——最靈活,萬能 driver.find_element_by_css_selector() #這裏的方法都可以寫做 driver.find_element(by.___,'__ ')的方法 例如:driver.find_element(By.ID,'q') 這裏需要調用 from selenium.webdriver.common.by import By 模塊
注意:上邊的都爲單個元素的查找方法,若想查詢多個元素需要將 element 換成 elements
prowser.page_source #獲取網頁渲染後的代碼。這樣就可以做到網頁的動態爬取了。
元素交互操作
#一個簡單的例子 from selenium import webdriver import time browser = webdriver.Chrome() browser.get('https://www.taobao.com') input = browser.find_element_by_id('q') input.send_keys('iPhone') time.sleep(3) input.clear() #清除輸入框 input.send_keys('iPad') button = browser.find_element_by_class_name('btn-search') button.click()
元素拖拽
要完成元素的拖拽,首先你需要指定被拖動的元素和拖動目標元素,然後利用 ActionChains 類來實現
from selenium import webdriver from selenium.webdriver import ActionChains 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') #找到id=draggable target = browser.find_element_by_css_selector('#droppable') #找到id=droppable actions = ActionChains(browser) actions.drag_and_drop(source,target) actions.perform()
這樣就實現了元素從 source 拖動到 target 的操作。
執行JS 實現進度條下拉
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') element = browser.find_element_by_name('fullname') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #移動到頁面最底部 time.sleep(5) #移動到元素element對象的“頂端”與當前窗口的“頂部”對齊 browser.execute_script("arguments[0].scrollIntoView();",element) time.sleep(5) browser.execute_script("window.scrollBy(0, 100)") #移動到指定的座標(相對當前的座標移動) time.sleep(5) browser.execute_script("window.scrollTo(0, 500)") #移動到窗口絕對位置座標,如下移動到縱座標1600像素位置 time.sleep(5) browser.execute_script("arguments[0].scrollIntoView(true)", element) time.sleep(5) #移動到元素element對象的“底端”與當前窗口的“底部”對齊 browser.execute_script("arguments[0].scrollIntoView(false)", element) time.sleep(5) browser.execute_script("window.scrollTo(0, 0);") #頁面最頂端 browser.execute_script('alert("To Bottom")') #跳出警告框
獲取ID,位置,標籤名,大小,html代碼
from selenium import webdriver browser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.id) print(input.location) print(input.tag_name) print(input.size) print(browser.page_source) #獲取渲染後的html代碼
等待操作
# 爬蟲在執行的過程中,目標站可能會有一些ajax請求,它不會管你的頁面是否加載成功(完全)
# 當頁面加載不完全時,執行ajax可能就會報錯,以導致程序出錯, 所以我們需要使用等待操作
# 隱式等待: 當使用了隱式等待執行測試的時候,如果WebDriver沒有在DOM中找到元素,將繼續等待,
# 超出設定時間後則拋出找不到元素的異常,也就是說,當查找元素或元素並沒有立即出現時,
# 隱式等待將等待一段時間再查找DOM,默認的時間是 0
#隱形操作 from selenium import webdriver browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get('https://www.zhihu.com/explore') input = browser.find_element_by_class_name('zu-top-add-question') print(input) browser.close()
# 顯式等待(比較常用) # 在指定時間內,判斷條件是否成立, 如果成立立即返回 # 如果不成立,就會一直等待, 如果仍不滿足條件, 拋出異常 # 用例: from selenium import webdriver from selenium.webdriver.common.by import By 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) browser.close()
一些判斷條件
# title_is 標題是否是某內容 # title_contains 標題是否包含某內容 # presence_of_element_located 元素加載出,傳輸定位元素,如(By.ID,'p') # visibility_of_element_located 元素可見,傳入定位元組 # visibility_of 可見,傳入元素對象 # presence_of_all_elements_located 所有元素加載出 # text_to_be_present_in_element 某個元素文本包含某文字 # text_to_be_present_in_element_value 某個元素值包含某文字 # frame_to_be_available_and_switch_to_it frame加載並切換 # 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 傳入元素對象以及狀態,相等返回True,否則返回False # element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,否則返回False # alert_is_present 是否出現Alert
瀏覽器控制
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.get('https://www.taobao.com') browser.get('https://python.org') browser.back() #後退 time.sleep(2) browser.forward() browser.close()
插入cookies
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'jim'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())
標籤頁管理
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(2) browser.switch_to_window(browser.window_handles[0]) browser.get('https://www.python.org')
異常處理
# 異常處理: # 在瀏覽器中的異常處理是比較麻煩的,因爲瀏覽器可能觸發的異常是非常多的 # 比如說,某個元素無法點擊的異常, 加載超時的異常, 某個元素的執行異常等等 # 這裏用了簡單的例子來說明異常 # 這裏還是建議要讀官方的文檔. # 用例: selenium 異常處理 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 NoSuchElemention: print('No Element') finally: browser.close()
小白筆記 如有錯誤 請提醒修改