一、什么是Selenium
Selenium是一個自動化測試工具,對各種瀏覽器都能很好地支持,包括Chrome、Firefox這些主流瀏覽器。使用它就可以模擬瀏覽器進行各種各樣的操作,包括爬取一些網(wǎng)頁內(nèi)容。當你看到瀏覽器自己運行并且在網(wǎng)頁上翻頁或者跳轉(zhuǎn)的時候,應該會覺得很有趣的。
安裝selenium
先安裝好Selenium庫和對應瀏覽器的WebDriver驅(qū)動,比如我用的是Chrome,則相對應安裝的是ChromeDriver。
1.安裝selenium # 打開命令控制符執(zhí)行 pip install selenium
2.我的Google Chrome 已是最新版本版本 74.0.3729.108(正式版本) (64 位)
安裝三大瀏覽器驅(qū)動driver
1.chromedriver 下載地址:http://chromedriver.storage.googleapis.com/index.html?path=74.0.3729.6/
2.Firefox的驅(qū)動geckodriver 下載地址:https://github.com/mozilla/geckodriver/releases/
3.IE的驅(qū)動IEdriver 下載地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
注意:64位向下兼容,直接下載32位的就可以啦,親測可用。
chromedriver_win32.zip
D:\Python\python\Scripts
.粘貼chromedriver.exe到文件d:\Python37\Scripts路徑下。
如果Chrome問題閃退 ,不兼容問題!
二、selenium基本使用
用python寫爬蟲的時候,主要用的是selenium的Webdriver,我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器
聲明瀏覽器對象:
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome() # 打開Google瀏覽器
#driver= webdriver.Firefox()
#driver= webdriver.Ie()
driver.get('http://www.baidu.com') # 打開 網(wǎng)址
#driver.get(r"C:\desktop\text.html") # 打開本地 html頁面
driver.maximize_window() #將瀏覽器最大化顯示
driver.set_window_size(480, 800) #設置瀏覽器寬480、高800顯示
# 移動瀏覽器大小觀看展示
driver.set_window_size(width=500, height=500, windowHandle="current")
driver.set_window_position(x=1000, y=100, windowHandle='current')
# 獲取當前頁面的源碼并斷言
pageSource = driver.page_source
sleep(2)
try:
assert u"百度一下,你就不知道" in pageSource, "頁面源碼中未找到'百度一下,你就知道'關鍵字"
# 斷言語句和 if 分支有點類似,它用于對一個 bool 表達式進行斷言,如果該 bool 表達式為 True,該程序可以繼續(xù)向下執(zhí)行;否則程序會引發(fā) AssertionError 錯誤。
except:
print("源碼這里故意斷言錯誤", "\n")
sleep(2)
try:
title = driver.title # 獲取打開網(wǎng)址 的名字
url = driver.current_url # 獲取打開網(wǎng)址的url
driver.page_sourse #打印出頁面源代碼
driver.forward() #瀏覽器前進
driver.back() #瀏覽器后退
except:
#print("Oops! That was no valid number. Try again ")
driver.close() #關閉這個頁面
# driver.quit() #退出瀏覽器
三 基本使用
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素
driver=webdriver.Chrome()
try:
driver.get('https://www.baidu.com')
input_tag=driver.find_element_by_id('kw')
input_tag.send_keys('美女') #python2中輸入中文錯誤,字符串前加個u
input_tag.send_keys(Keys.ENTER) #輸入回車
wait=WebDriverWait(driver,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left'))) #等到id為content_left的元素加載完畢,最多等10秒
print(driver.page_source) # 打印出頁面源代碼
print(driver.current_url) # 獲取打開網(wǎng)址的url
print(driver.get_cookies()) #cookies
finally:
driver.close()
四 選擇器
一 瀏覽器操作
driver.current_url #用于獲得當前頁面的URL
driver.title #用于獲取當前頁面的標題
driver.page_source #用于獲取頁面html源代碼
driver.port #用于獲取瀏覽器的端口
driver.capabilities['version'] #打印瀏覽器version的值
#瀏覽器:
driver.get(url):#瀏覽器加載url
driver.back() #瀏覽器后退
driver.forward() #瀏覽器前進
driver.refresh() #瀏覽器刷新(點擊刷新按鈕)
driver.set_page_load_timeout(5) #設置頁面加載時間,如果超時會跑異常
driver.implicitly_wait(秒) #隱式等待,通過一定的時長等待頁面上某一元素加載完成。
#若提前定位到元素,則繼續(xù)執(zhí)行。等待10s若超過時間未加載出,則拋出NoSuchElementException異常。
#執(zhí)行js:
driver.execute_script(js) #調(diào)用js
二 窗口和彈框操作
#窗口:
driver.current_window_handle #用于獲取當前窗口句柄
driver.window_handles #用于獲取所有窗口句柄
driver.maximize_window() #將瀏覽器最大化顯示
driver.set_window_size(480, 800) #設置瀏覽器寬480、高800顯示
driver.get_window_size() #獲取當前窗口的長和寬
driver.get_window_position() #獲取當前窗口坐標
driver.set_window_position(300,200) #設置當前窗口坐標
driver.get_screenshot_as_file(filename) #截取當前窗口
#實例:driver.get_screenshot_as_file('D:/selenium/image/baidu.jpg')
driver.close() #關閉當前窗口,或最后打開的窗口
driver.quit() #關閉所有關聯(lián)窗口,并且安全關閉session
#窗口切換:
driver.switch_to_frame(id或name屬性值)#切換到新表單(同一窗口)。若無id或?qū)傩灾担上韧ㄟ^xpath定位到iframe,再將值傳給switch_to_frame()
driver.switch_to.parent_content()#跳出當前一級表單。該方法默認對應于離它最近的switch_to.frame()方法
driver.switch_to.default_content() #跳回最外層的頁面
driver.switch_to_window(窗口句柄) #切換到新窗口
driver.switch_to.window(窗口句柄) #切換到新窗口
#彈框切換:
driver.switch_to_alert() #警告框處理。處理JavaScript所生成的alert,confirm,prompt
driver.switch_to.alert() #警告框處理
三 cookies 操作
driver.get_cookies() #獲取當前會話所有cookie信息
driver.get_cookie(cookie_name) #返回字典的key為“cookie_name”的cookie信息。
#實例:driver.get_cookie("NET_SessionId")
driver.add_cookie(cookie_dict) #添加cookie。“cookie_dict”指字典對象,必須有name和value值
driver.delete_cookie(name,optionsString) #刪除cookie信息
driver.delete_all_cookies() #刪除所有cookie信息
四 頁面元素操作
# 屬性:
element.size #獲取元素的尺寸。
element.text #獲取元素的文本。
element.tag_name #獲取標簽名稱
element.clear() #用于清除輸入框的默認內(nèi)容
element.send_keys("xx") #用于在一個輸入框里輸入 xx 內(nèi)容
element.click() #用于單擊一個按鈕
element.submit() #提交表單
element.size #返回元素的尺寸
element.text #獲取元素文本
element.get_attribute('value')
#返回元素的屬性值,可以是id、name、type或元素擁有的其它任意屬性
#如果是input的,可以通過獲取value值獲得當前輸入的值
element.is_displayed ()
#返回元素的結(jié)果是否可見,返回結(jié)果為True或False
element.is_enabled() #判斷元素是否可用
element.is_selected() #返回單選按鈕、復選框元素結(jié)果是否被選中(True 或 False)
element.value_of_css_property(height) #獲取元素css樣式屬性
五 鼠標事件
#引入ActionChains類
from selenium.webdriver.common.action_chains import ActionChains
mouse =driver.find_element_by_xpath("xx") #定位鼠標元素
#對定位到的元素執(zhí)行鼠標操作
ActionChains(driver).context_click(mouse).perform() #鼠標右鍵操作
ActionChains(driver).double_click(mouse).perform() #鼠標雙擊操作
ActionChains(driver).move_to_element(mouse).perform() #鼠標移動到上面的操作
ActionChains(driver).click_and_hold(mouse).perform() #鼠標左鍵按下的操作
ActionChains(driver).release(mouse).perform() #鼠標釋放
#鼠標拖拽
element = driver.find_element_by_name("xxx") #定位元素的原位置
target = driver.find_element_by_name("xxx") #定位元素要移動到的目標位置
ActionChains(driver).drag_and_drop(element, target).perform() #執(zhí)行元素的移動操作
復制代碼
六 鍵盤事件
#引入Keys類包
from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.BACK_SPACE) #刪除鍵(BackSpace)
element.send_keys(Keys.SPACE) #空格鍵(Space)
element.send_keys(Keys.TAB) #制表鍵(Tab)
element.send_keys(Keys.ESCAPE) #回退鍵(Esc)
element.send_keys(Keys.ENTER) #回車鍵(Enter)
element.send_keys(Keys.CONTROL,'a') #全選(Ctrl+A)
element.send_keys(Keys.CONTROL,'c') #復制(Ctrl+C)
element.send_keys(Keys.CONTROL,'x') #剪切(Ctrl+X)
element.send_keys(Keys.CONTROL,'v') #粘貼(Ctrl+V)
element.send_keys(Keys.F12) #鍵盤F12
#輸入空格鍵+“python”
element.send_keys(Keys.SPACE)
element.send_keys("python")
案例
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 模擬鍵盤操作
from time import sleep
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(input.text)
browser.find_element_by_id('zu-top-add-question').click() # 點擊進入
# browser.find_element_by_class_name('zu-top-add-question').click() # 點擊進入
#from selenium import webdriver
#browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
#
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]') # //*[@id="q"]
input_third1 = browser.find_element_by_xpath('/html/body/div[3]/div/h2').text # 獲取文字內(nèi)容
input_third2 = browser.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').text # 獲取文字內(nèi)容
browser.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click() # 點擊進入
print(input_first)
print(input_second)
print(input_third)
print(input_third1)
print(input_third2)
# browser.close()
element = browser.find_element_by_tag_name('body')
element.send_keys(Keys.CONTROL,'a') #全選(Ctrl+A)
element.send_keys(Keys.CONTROL,'c') #復制(Ctrl+C)
browser.get("http://www.taobao.com")
# browser.find_element_by_id("q").send_keys(Keys.CONTROL, 'v') #粘貼(Ctrl+V)
browser.find_element_by_id("q").send_keys(input_third1) #粘貼(Ctrl+V)
# element.send_keys(Keys.CONTROL,'v') #粘貼(Ctrl+V)
sleep(3)
# element.send_keys(Keys.CONTROL,'x') #剪切(Ctrl+X)
browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click() # 點擊進入
#element.send_keys(Keys.BACK_SPACE) #刪除鍵(BackSpace)
#element.send_keys(Keys.SPACE) #空格鍵(Space)
#element.send_keys(Keys.TAB) #制表鍵(Tab)
#element.send_keys(Keys.ESCAPE) #回退鍵(Esc)
#element.send_keys(Keys.ENTER) #回車鍵(Enter)
#element.send_keys(Keys.F12) #鍵盤F12
定位元素的8種方式
參考:selenium元素定位
定位一個元素 定位多個元素 含義
find_element_by_id find_elements_by_id 通過元素id定位
find_element_by_name find_elements_by_name 通過元素name定位
find_element_by_xpath find_elements_by_xpath 通過xpath表達式定位
find_element_by_link_text find_elements_by_link_tex 通過完整超鏈接定位
find_element_by_partial_link_text find_elements_by_partial_link_text 通過部分鏈接定位
find_element_by_tag_name find_elements_by_tag_name 通過標簽定位
find_element_by_class_name find_elements_by_class_name 通過類名進行定位
find_elements_by_css_selector find_elements_by_css_selector 通過css選擇器進行定位
3.實例演示
假如我們有一個Web頁面,通過前端工具(如,F(xiàn)irebug)查看到一個元素的屬性是這樣的。
新聞
hao123
通過link text定位:
dr.find_element_by_link_text("新聞")
dr.find_element_by_link_text("hao123")
通過partial link text定位:
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
