2万字带你攻略掉Selenium
目錄
1. 準備工作
1.1 安裝selenium庫
1.2 安裝瀏覽器驅動
2. 基本用法
2.1 初始化瀏覽器對象
2.2 訪問頁面
2.3 設置瀏覽器大小
2.4? 刷新頁面
2.5?前進后退
3. 獲取頁面基礎屬性
4. 定位頁面元素
4.1 id定位
4.2?name定位
4.3 class定位
4.4 tag定位
4.5 link定位
4.6?partial定位
4.7 xpath定位
4.8 css定位
4.9 find_element的By定位
4.10 多個元素
5. 獲取頁面元素屬性?
5.1 get_attribute獲取屬性
5.2 獲取文本
5.3 獲取其他屬性
6. 頁面交互操作?
6.1 輸入文本
6.2 點擊
6.3 清除文本
6.4 回車確認
6.5 單選
6.6 多選
5.7. 下拉框
7. 多窗口切換
7.1 Frame切換
7.2 選項卡切換
8. 模擬鼠標操作?
8.1 左鍵
8.2 右鍵
8.3 雙擊
8.4 拖拽
8.5 懸停
9. 模擬鍵盤操作
10. 延時等待
10.1 強制等待
10.2 隱式等待
9.3. 顯式等待
11. 其他
11.1. 運行JavaScript
11.2. Cookie
11.3. 反屏蔽
1. 準備工作
在開始后續功能演示之前,我們需要先安裝Chrome瀏覽器并配置好ChromeDriver,當然也需要安裝selenium庫!
1.1 安裝selenium庫
pip install selenium1.2 安裝瀏覽器驅動
其實,有兩種方式安裝瀏覽器驅動:一種是常見的手動安裝,另一種則是利用第三方庫自動安裝。
以下前提:大家都已經安裝好了Chrome瀏覽器哈
手動安裝
自動安裝:
自動安裝需要用到第三方庫webdriver_manager,先安裝這個庫:
pip install webdriver_manager然后調用下列方法進行自動安裝。
from?selenium?import?webdriver from?selenium.webdriver.common.keys?import?Keys from?webdriver_manager.chrome?import?ChromeDriverManagerbrowser?=?webdriver.Chrome(ChromeDriverManager().install())browser.get('http://www.baidu.com') search?=?browser.find_element_by_id('kw') search.send_keys('python') search.send_keys(Keys.ENTER)#?關閉瀏覽器 browser.close()在上述代碼中,ChromeDriverManager().install()方法就是自動安裝驅動的操作,它會自動獲取當前瀏覽器的版本并去下載對應的驅動到本地。
====== WebDriver manager ====== Current google-chrome version is 96.0.4664 Get LATEST chromedriver version for 96.0.4664 google-chrome There is no [win32] chromedriver for browser in cache Trying to download new driver from https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_win32.zip Driver has been saved in cache[C:\Users\z2577\.wdm\drivers\chromedriver\win32\96.0.4664.45]如果本地已經有該瀏覽器渠道,則會提示其已存在。
======?WebDriver?manager?====== Current?google-chrome?version?is?96.0.4664 Get?LATEST?driver?version?for?96.0.4664 Driver?[C:\Users\z2577\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe]?found?in?cache
搞定以上準備工作,我們就可以開始本文正式內容的學習啦~
2. 基本用法
首先我們就從初始化瀏覽器對象、訪問頁面、設置瀏覽器大小、刷新頁面和前進后退等基礎操作。
2.1 初始化瀏覽器對象
在準備工作部分我們提到需要將瀏覽器渠道添加到環境變量或者指定絕對路徑,前者可以直接初始化后者則需要進行指定。
添加環境變量就不多加介紹了,上面手動安裝那里有介紹
接下來,我們介紹一下,指定路徑吧
from selenium import webdriver# 初始化瀏覽器為chrome瀏覽器 browser = webdriver.Chrome()# 指定絕對路徑的方式 path = r'C:\Users\z2577\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe' browser = webdriver.Chrome(path)# 關閉瀏覽器 browser.close()?返回:
?可以看到以上是有界面的瀏覽器,我們還可以初始化瀏覽器為無界面的瀏覽器。
接下來我們訪問下 百度 試試
from selenium import webdriver# 無界面的瀏覽器 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("headless") browser = webdriver.Chrome(chrome_options = option)# 訪問百度首頁 browser.get(r'https://www.baidu.com/') # 截圖預覽 browser.get_screenshot_as_file('截圖.png')# 關閉瀏覽器 browser.close()返回截圖:
完成瀏覽器對象的初始化后并將其賦值給了browser對象,接下來我們就可以調用browser來執行各種方法模擬瀏覽器的操作了。
2.2 訪問頁面
進行頁面訪問使用的是get方法,傳入參數為待訪問頁面的URL地址即可。
from selenium import webdriver# 初始化瀏覽器為chrome瀏覽器 browser = webdriver.Chrome()# 訪問百度首頁 browser.get(r'https://www.baidu.com/')# 關閉瀏覽器 # browser.close()返回:
2.3 設置瀏覽器大小
set_window_size()方法可以用來設置瀏覽器大小(就是分辨率),而?maximize_window?則是設置瀏覽器為全屏!
from selenium import webdriver import time browser = webdriver.Chrome()# 設置瀏覽器大小:全屏 browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)# 設置分辨率 500*500 browser.set_window_size(500,500) time.sleep(2)# 設置分辨率 1000*800 browser.set_window_size(1000,800) time.sleep(2)# 關閉瀏覽器 browser.close()運行后,頁面首先是全屏,然后慢慢變小,最后關閉,在這里就不進行截圖了,如果你不想瀏覽器自動關閉的話,將最后一行關閉瀏覽器代碼進行注釋即可。
2.4? 刷新頁面
刷新頁面是我們在瀏覽器操作時很常用的操作,這里?refresh()方法可以用來進行瀏覽器頁面刷新。
from selenium import webdriver import time browser = webdriver.Chrome()# 設置瀏覽器全屏 browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)try:# 刷新頁面browser.refresh() print('刷新頁面成功') except Exception as e:print('刷新失敗')# 關閉瀏覽器 browser.close()運行效果和 F5 一樣,也不在這里進行截圖了,如果你不想瀏覽器自動關閉的話,將最后一行關閉瀏覽器代碼進行注釋即可。
2.5?前進后退
前進后退也是我們在使用瀏覽器時非常常見的操作,這里forward()方法可以用來實現前進,back()可以用來實現后退。
我這在這里通過進入 百度 和 淘寶 頁面進行演示:
from selenium import webdriver import time browser = webdriver.Chrome()# 設置瀏覽器全屏 browser.maximize_window() browser.get(r'https://www.baidu.com') time.sleep(2)# 打開淘寶頁面 browser.get(r'https://www.taobao.com') time.sleep(2)# 后退到百度頁面 browser.back() time.sleep(2)# 前進的淘寶頁面 browser.forward() time.sleep(2)# 關閉瀏覽器 browser.close()具體效果請自行進行吧,如果你不想瀏覽器自動關閉的話,將最后一行關閉瀏覽器代碼進行注釋即可。
3. 獲取頁面基礎屬性
當我們用?selenium?打開某個頁面,有一些基礎屬性如網頁標題、網址、瀏覽器名稱、頁面源碼等信息。
from selenium import webdriverbrowser = webdriver.Chrome() browser.get(r'https://www.baidu.com') # 網頁標題 print(browser.title) # 當前網址 print(browser.current_url) # 瀏覽器名稱 print(browser.name) # 網頁源碼 print(browser.page_source)返回:
我們得到頁面源碼后,可以用正則表達式、Bs4、xpath以及pyquery等工具進行解析提取想要的信息了。
4. 定位頁面元素
我們在實際使用瀏覽器的時候,很重要的操作有輸入文本、點擊確定等等。對此,Selenium提供了一系列的方法來方便我們實現以上操作。常說的8種定位頁面元素的操作方式,我們一一演示一下!
我們以百度首頁的搜索框節點為例,搜索python
搜索框的html結構:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">4.1 id定位
find_element_by_id()根據id屬性獲取,這里id屬性是?kw
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_id('kw').send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()返回:
4.2?name定位
find_element_by_name()根據name屬性獲取,這里name屬性是?wd
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_name('wd').send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()返回結果同上?
4.3 class定位
find_element_by_class_name()根據class屬性獲取,這里class屬性是s_ipt
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_class_name('s_ipt').send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()?返回結果同上?
4.4 tag定位
我們知道HTML是通過tag來定義功能的,比如input是輸入,table是表格等等。每個元素其實就是一個tag,一個tag往往用來定義一類功能,我們查看百度首頁的html代碼,可以看到有很多同類tag,所以其實很難通過tag去區分不同的元素。
find_element_by_tag_name()
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_tag_name('input').send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()返回:
結果中報錯了,因為存在多個input
4.5 link定位
這種方法顧名思義就是用來定位文本鏈接的,比如百度首頁上方的分類模塊鏈接。
find_element_by_link_text()?
以新聞為例
我們可以通過下面代碼實現:
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 點擊新聞 鏈接 browser.find_element_by_link_text('新聞').click() time.sleep(2)# 關閉瀏覽器全部頁面 browser.quit()返回:
4.6?partial定位
有時候一個超鏈接的文本很長,我們如果全部輸入,既麻煩,又顯得代碼很不美觀,這時候我們就可以只截取一部分字符串,用這種方法模糊匹配了。
find_element_by_partial_link_text()
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 點擊新聞 鏈接 browser.find_element_by_partial_link_text('聞').click() time.sleep(2)# 關閉瀏覽器全部頁面 browser.quit()在這里單號結果同時,因為帶”聞“字的只有一個
4.7 xpath定位
前面介紹的幾種定位方法都是在理想狀態下,有一定使用范圍的,那就是:在當前頁面中,每個元素都有一個唯一的id或name或class或超鏈接文本的屬性,那么我們就可以通過這個唯一的屬性值來定位他們。
但是在實際工作中并非有這么美好,那么這個時候我們就只能通過xpath或者css來定位了。
find_element_by_xpath()
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_xpath("//*[@id='kw']").send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()4.8 css定位
這種方法相對xpath要簡潔些,定位速度也要快些。
find_element_by_css_selector()
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') time.sleep(2)# 在搜索框輸入 python browser.find_element_by_css_selector('#kw').send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()4.9 find_element的By定位
除了上述的8種定位方法,Selenium還提供了一個通用的方法find_element(),這個方法有兩個參數:定位方式和定位值。
使用前先導入By類:
# 使用前先導入By類 from selenium.webdriver.common.by import By下面8種方法對應上面的8種:
browser.find_element(By.ID,'kw') browser.find_element(By.NAME,'wd') browser.find_element(By.CLASS_NAME,'s_ipt') browser.find_element(By.TAG_NAME,'input') browser.find_element(By.LINK_TEXT,'新聞') browser.find_element(By.PARTIAL_LINK_TEXT,'聞') browser.find_element(By.XPATH,'//*[@id="kw"]') browser.find_element(By.CSS_SELECTOR,'#kw')4.10 多個元素
如果定位的目標元素在網頁中不止一個,那么則需要用到find_elements,得到的結果會是列表形式。簡單來說,就是element后面多了復數標識s,其他操作一致。
5. 獲取頁面元素屬性?
既然我們有很多方式來定位頁面的元素,那么接下來就可以考慮獲取以下元素的屬性了,尤其是用Selenium進行網絡爬蟲的時候。
5.1 get_attribute獲取屬性
以百度首頁的logo為例,獲取logo相關屬性
<img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width="270" height="129" onerror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;" usemap="#mp">獲取logo的圖片地址:
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_class_name('index-logo-src') print(logo) print(logo.get_attribute('src'))# 關閉瀏覽器 browser.close()返回:
5.2 獲取文本
?以熱榜為例,獲取熱榜文本和鏈接:
<a class="title-content tag-width c-link c-font-medium c-line-clamp1" href="https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%85%9A%E5%8E%86%E5%8F%B2%E8%87%AA%E4%BF%A1%E7%9A%84%E6%9C%80%E5%A4%A7%E5%BA%95%E6%B0%94&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1" target="_blank"><span class="title-content-index c-index-single c-index-single-hot1">1</span><span class="title-content-title">黨歷史自信的最大底氣</span></a>?獲取熱榜的文本,用的是text屬性,直接調用即可
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a') print(logo.text) print(logo.get_attribute('href'))# 關閉瀏覽器 browser.close()返回:
5.3 獲取其他屬性
除了屬性和文本值外,還有id、位置、標簽名和大小等屬性。
from selenium import webdriver import time browser = webdriver.Chrome()browser.get(r'https://www.baidu.com') logo = browser.find_element_by_class_name('index-logo-src') print(logo.id) print(logo.location) print(logo.tag_name) print(logo.size)# 關閉瀏覽器 browser.close()返回:
6. 頁面交互操作?
頁面交互就是在瀏覽器的各種操作,比如上面演示過的輸入文本、點擊鏈接等等,還有像清除文本、回車確認、單選框與多選框選中等。
6.1 輸入文本
其實,在之前的小節中我們有用過此操作。
send_keys()
from selenium import webdriver import time browser = webdriver.Chrome() browser.get(r'https://www.baidu.com') time.sleep(2)# 定位搜索框 input = browser.find_element_by_class_name('s_ipt') # 輸入python input.send_keys('python') time.sleep(2)# 關閉瀏覽器 browser.close()6.2 點擊
同樣,我們也用過這個點擊操作。
click()
from selenium import webdriver import time browser = webdriver.Chrome() browser.get(r'https://www.baidu.com') time.sleep(2)# 選中新聞按鈕 click = browser.find_element_by_link_text('新聞') # 點擊之 click.click() time.sleep(2)# 關閉瀏覽器全部頁面 browser.quit()6.3 清除文本
既然有輸入,這里也就有清除文本啦。
clear()
from selenium import webdriver import time browser = webdriver.Chrome() browser.get(r'https://www.baidu.com') time.sleep(2)# 定位搜索框 input = browser.find_element_by_class_name('s_ipt') # 輸入python input.send_keys('python') time.sleep(2) # 清除文本python input.clear() time.sleep(2)# 關閉瀏覽器 browser.close()6.4 回車確認
比如,在搜索框輸入文本python,然后回車就出查詢操作結果的情況。
submit()
6.5 單選
單選比較好操作,先定位需要單選的某個元素,然后點擊一下即可。
6.6 多選
多選好像也比較容易,依次定位需要選擇的元素,點擊即可。
5.7. 下拉框
下拉框的操作相對復雜一些,需要用到Select模塊。
先導入該類
from?selenium.webdriver.support.select?import?Select在select模塊中有以下定位方法
'''1、三種選擇某一選項項的方法'''select_by_index() # 通過索引定位;注意:index索引是從“0”開始。 select_by_value() # 通過value值定位,value標簽的屬性值。 select_by_visible_text() # 通過文本值定位,即顯示在下拉框的值。'''2、三種返回options信息的方法'''options # 返回select元素所有的options all_selected_options # 返回select元素中所有已選中的選項 first_selected_options # 返回select元素中選中的第一個選項 '''3、四種取消選中項的方法'''deselect_all # 取消全部的已選擇項 deselect_by_index # 取消已選中的索引項 deselect_by_value # 取消已選中的value值 deselect_by_visible_text # 取消已選中的文本值?我們來進行演示一波,由于暫時沒找到合適的網頁,我這邊寫了一個簡單的網頁本地測試(文件存為 二狗.html)
<html><body><form> <select name="帥哥"> <option value="才哥">才哥</option> <option value="小明" selected="">小明</option> <option value="小華">小華</option> <option value="草兒">小草</option> </select> </form></body> </html>然后,再演示下拉框的不同選擇的方式
from selenium import webdriver from selenium.webdriver.support.select import Select import timeurl = 'file://D:\桌面/二狗.html'browser = webdriver.Chrome()browser.get(url) time.sleep(2)# 根據索引選擇 Select(browser.find_element_by_name("帥哥")).select_by_index("2") time.sleep(2) # 根據value值選擇 Select(browser.find_element_by_name("帥哥")).select_by_value("草兒") time.sleep(2) # 根據文本值選擇 Select(browser.find_element_by_name("帥哥")).select_by_visible_text("才哥") time.sleep(2)# 關閉瀏覽器 browser.close()具體效果就不在這里演示了
7. 多窗口切換
比如同一個頁面的不同子頁面的節點元素獲取操作,不同選項卡之間的切換以及不同瀏覽器窗口之間的切換操作等等。
7.1 Frame切換
Selenium打開一個頁面之后,默認是在父頁面進行操作,此時如果這個頁面還有子頁面,想要獲取子頁面的節點元素信息則需要切換到子頁面進行擦走,這時候?switch_to.frame()就來了。如果想回到父頁面,用?switch_to.parent_frame()即可。
7.2 選項卡切換
我們在訪問網頁的時候會打開很多個頁面,在Selenium中提供了一些方法方便我們對這些頁面進行操作。
current_window_handle:獲取當前窗口的句柄。
window_handles:返回當前瀏覽器的所有窗口的句柄。
switch_to_window():用于切換到對應的窗口。
from?selenium?import?webdriver import?timebrowser?=?webdriver.Chrome()#?打開百度 browser.get('http://www.baidu.com') #?新建一個選項卡 browser.execute_script('window.open()') print(browser.window_handles) #?跳轉到第二個選項卡并打開知乎 browser.switch_to.window(browser.window_handles[1]) browser.get('http://www.zhihu.com') #?回到第一個選項卡并打開淘寶(原來的百度頁面改為了淘寶) time.sleep(2) browser.switch_to.window(browser.window_handles[0]) browser.get('http://www.taobao.com')8. 模擬鼠標操作?
既然是模擬瀏覽器操作,自然也就需要能模擬鼠標的一些操作了,這里需要導入ActionChains?類。
from?selenium.webdriver.common.action_chains?import?ActionChains8.1 左鍵
這個其實就是頁面交互操作中的點擊click()操作。
8.2 右鍵
context_click()
from?selenium.webdriver.common.action_chains?import?ActionChains from?selenium?import?webdriver import?time??browser?=?webdriver.Chrome() browser.get(r'https://www.baidu.com')?? time.sleep(2)#?定位到要右擊的元素,這里選的新聞鏈接 right_click?=?browser.find_element_by_link_text('新聞')#?執行鼠標右鍵操作 ActionChains(browser).context_click(right_click).perform() time.sleep(2)#?關閉瀏覽器 browser.close()在上述操作中
ActionChains(browser):調用ActionChains()類,并將瀏覽器驅動browser作為參數傳入
context_click(right_click):模擬鼠標雙擊,需要傳入指定元素定位作為參數
perform():執行ActionChains()中儲存的所有操作,可以看做是執行之前一系列的操作
8.3 雙擊
double_click()
from?selenium.webdriver.common.action_chains?import?ActionChains from?selenium?import?webdriver import?time??browser?=?webdriver.Chrome() browser.get(r'https://www.baidu.com')?? time.sleep(2)#?定位到要雙擊的元素 double_click?=?browser.find_element_by_css_selector('#bottom_layer?>?div?>?p:nth-child(8)?>?span')#?雙擊 ActionChains(browser).double_click(double_click).perform() time.sleep(15)#?關閉瀏覽器 browser.close()8.4 拖拽
drag_and_drop(source,target)拖拽操作嘛,開始位置和結束位置需要被指定,這個常用于滑塊類驗證碼的操作之類。
我們以菜鳥教程的一個案例來進行演示
菜鳥教程在線編輯器
from?selenium.webdriver.common.action_chains?import?ActionChains from?selenium?import?webdriver import?time??browser?=?webdriver.Chrome() url?=?'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url)?? time.sleep(2)browser.switch_to.frame('iframeResult')#?開始位置 source?=?browser.find_element_by_css_selector("#draggable")#?結束位置 target?=?browser.find_element_by_css_selector("#droppable")#?執行元素的拖放操作 actions?=?ActionChains(browser) actions.drag_and_drop(source,?target) actions.perform() #?拖拽 time.sleep(15)#?關閉瀏覽器 browser.close()?返回:
8.5 懸停
move_to_element()
from?selenium.webdriver.common.action_chains?import?ActionChains from?selenium?import?webdriver import?time??browser?=?webdriver.Chrome() url?=?'https://www.baidu.com' browser.get(url)?? time.sleep(2)#?定位懸停的位置 move?=?browser.find_element_by_css_selector("#form?>?span.bg.s_ipt_wr.new-pmd.quickdelete-wrap?>?span.soutu-btn")#?懸停操作 ActionChains(browser).move_to_element(move).perform() time.sleep(5)#?關閉瀏覽器 browser.close()返回懸停效果:
9. 模擬鍵盤操作
selenium中的Keys()類提供了大部分的鍵盤操作方法,通過send_keys()方法來模擬鍵盤上的按鍵。
引入Keys類
from?selenium.webdriver.common.keys?import?Keys常見的鍵盤操作
send_keys(Keys.BACK_SPACE):刪除鍵(BackSpace)
send_keys(Keys.SPACE):空格鍵(Space)
send_keys(Keys.TAB):制表鍵(TAB)
send_keys(Keys.ESCAPE):回退鍵(ESCAPE)
send_keys(Keys.ENTER):回車鍵(ENTER)
send_keys(Keys.CONTRL,'a'):全選(Ctrl+A)
send_keys(Keys.CONTRL,'c'):復制(Ctrl+C)
send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v'):粘貼(Ctrl+V)
send_keys(Keys.F1):鍵盤F1
.....
send_keys(Keys.F12):鍵盤F12
實例操作演示:
定位需要操作的元素,然后操作即可!
from?selenium.webdriver.common.keys?import?Keys from?selenium?import?webdriver import?timebrowser?=?webdriver.Chrome() url?=?'https://www.baidu.com' browser.get(url)?? time.sleep(2)#?定位搜索框 input?=?browser.find_element_by_class_name('s_ipt') #?輸入python input.send_keys('python') time.sleep(2)#?回車 input.send_keys(Keys.ENTER) time.sleep(5)#?關閉瀏覽器 browser.close()10. 延時等待
如果遇到使用ajax加載的網頁,頁面元素可能不是同時加載出來的,這個時候嘗試在get方法執行完成時獲取網頁源代碼可能并非瀏覽器完全加載完成的頁面。所以,這種情況下需要設置延時等待一定時間,確保全部節點都加載出來。
三種方式可以來玩玩:強制等待、隱式等待和顯式等待
10.1 強制等待
就很簡單了,直接time.sleep(n)強制等待n秒,在執行get方法之后執行。
10.2 隱式等待
implicitly_wait()設置等待時間,如果到時間有元素節點沒有加載出來,就會拋出異常。
from?selenium?import?webdriverbrowser?=?webdriver.Chrome()#?隱式等待,等待時間10秒 browser.implicitly_wait(10)??browser.get('https://www.baidu.com') print(browser.current_url) print(browser.title)#?關閉瀏覽器 browser.close()9.3. 顯式等待
設置一個等待時間和一個條件,在規定時間內,每隔一段時間查看下條件是否成立,如果成立那么程序就繼續執行,否則就拋出一個超時異常。
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import timebrowser = webdriver.Chrome() browser.get('https://www.baidu.com') # 設置等待時間10s wait = WebDriverWait(browser, 10) # 設置判斷條件:等待id='kw'的元素加載完成 input = wait.until(EC.presence_of_element_located((By.ID, 'kw'))) # 在關鍵詞輸入:關鍵詞 input.send_keys('Python')# 關閉瀏覽器 time.sleep(2) browser.close()WebDriverWait的參數說明:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver: 瀏覽器驅動
timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
poll_frequency: 每次檢測的間隔時間,默認是0.5秒
ignored_exceptions:超時后的異常信息,默認情況下拋出NoSuchElementException異常
until(method,message='')
method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not(method,message='')
until_not?與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同。
其他等待條件
from selenium.webdriver.support import expected_conditions as EC# 判斷標題是否和預期的一致 title_is # 判斷標題中是否包含預期的字符串 title_contains# 判斷指定元素是否加載出來 presence_of_element_located # 判斷所有元素是否加載完成 presence_of_all_elements_located# 判斷某個元素是否可見. 可見代表元素非隱藏,并且元素的寬和高都不等于0,傳入參數是元組類型的locator visibility_of_element_located # 判斷元素是否可見,傳入參數是定位后的元素WebElement visibility_of # 判斷某個元素是否不可見,或是否不存在于DOM樹 invisibility_of_element_located# 判斷元素的 text 是否包含預期字符串 text_to_be_present_in_element # 判斷元素的 value 是否包含預期字符串 text_to_be_present_in_element_value#判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement frame_to_be_available_and_switch_to_it#判斷是否有alert出現 alert_is_present#判斷元素是否可點擊 element_to_be_clickable# 判斷元素是否被選中,一般用在下拉列表,傳入WebElement對象 element_to_be_selected # 判斷元素是否被選中 element_located_to_be_selected # 判斷元素的選中狀態是否和預期一致,傳入參數:定位后的元素,相等返回True,否則返回False element_selection_state_to_be # 判斷元素的選中狀態是否和預期一致,傳入參數:元素的定位,相等返回True,否則返回False element_located_selection_state_to_be#判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否刷新了 staleness_of11. 其他
補充一些
11.1. 運行JavaScript
還有一些操作,比如下拉進度條,模擬javaScript,使用execute_script方法來實現。
from?selenium?import?webdriverbrowser?=?webdriver.Chrome() #?知乎發現頁 browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0,?document.body.scrollHeight)') browser.execute_script('alert("To?Bottom")')返回:
?
11.2. Cookie
在selenium使用過程中,還可以很方便對Cookie進行獲取、添加與刪除等操作。
from?selenium?import?webdriverbrowser?=?webdriver.Chrome() #?知乎發現頁 browser.get('https://www.zhihu.com/explore') #?獲取cookie print(f'Cookies的值:{browser.get_cookies()}') #?添加cookie browser.add_cookie({'name':'才哥',?'value':'帥哥'}) print(f'添加后Cookies的值:{browser.get_cookies()}') #?刪除cookie browser.delete_all_cookies() print(f'刪除后Cookies的值:{browser.get_cookies()}')?返回:
11.3. 反屏蔽
例如,美團直接把Selenium給屏蔽了,不知道怎么搞!!
總結
以上是生活随笔為你收集整理的2万字带你攻略掉Selenium的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无季节效应的非平稳序列分析(一)
- 下一篇: android slidingdrawe