selenium的其它使用方法
知識點:
- 掌握 selenium控制標簽頁的切換
- 掌握 selenium控制iframe的切換
- 掌握 利用selenium獲取cookie的方法
- 掌握 手動實現頁面等待
- 掌握 selenium控制瀏覽器執行js代碼的方法
- 掌握 selenium開啟無界面模式
- 了解 selenium使用代理ip
- 了解 selenium替換user-agent
1. selenium標簽頁的切換
當selenium控制瀏覽器打開多個標簽頁時,如何控制瀏覽器在不同的標簽頁中進行切換呢?需要我們做以下兩步:
獲取所有標簽頁的窗口句柄
-
利用窗口句柄字切換到句柄指向的標簽頁
- 這里的窗口句柄是指:指向標簽頁對象的標識
- 關于句柄請課后了解更多,本小節不做展開
-
具體的方法
# 1. 獲取當前所有的標簽頁的句柄構成的列表 current_windows = driver.window_handles # 2. 根據標簽頁句柄列表索引下標進行切換 driver.switch_to.window(current_windows[0])
-
參考代碼示例:
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com/") time.sleep(1) driver.find_element_by_id('kw').send_keys('python') time.sleep(1) driver.find_element_by_id('su').click() time.sleep(1) # 通過執行js來新開一個標簽頁 js = 'window.open("https://www.sogou.com");' driver.execute_script(js) time.sleep(1) # 1. 獲取當前所有的窗口 windows = driver.window_handles time.sleep(2) # 2. 根據窗口索引進行切換 driver.switch_to.window(windows[0]) time.sleep(2) driver.switch_to.window(windows[1]) time.sleep(6) driver.quit()
知識點:掌握 selenium控制標簽頁的切換
2. switch_to切換frame標簽
iframe是html中常用的一種技術,即一個頁面中嵌套了另一個網頁,selenium默認是訪問不了frame中的內容的,對應的解決思路是
driver.switch_to.frame(frame_element)
。接下來我們通過qq郵箱模擬登陸來學習這個知識點
-
參考代碼:
import time from selenium import webdriver driver = webdriver.Chrome() url = 'https://mail.qq.com/cgi-bin/loginpage' driver.get(url) time.sleep(2) login_frame = driver.find_element_by_id('login_frame') # 根據id定位 frame元素 driver.switch_to.frame(login_frame) # 轉向到該frame中 driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com') time.sleep(2) driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode') time.sleep(2) driver.find_element_by_xpath('//*[@id="login_button"]').click() time.sleep(2) """操作frame外邊的元素需要切換出去""" windows = driver.window_handles driver.switch_to.window(windows[0]) content = driver.find_element_by_class_name('login_pictures_title').text print(content) driver.quit()
-
總結:
-
切換到定位的frame標簽嵌套的頁面中
driver.switch_to.frame(通過find_element_by函數定位的frame、iframe標簽對象)
-
利用切換標簽頁的方式切出frame標簽
windows = driver.window_handles driver.switch_to.window(windows[0])
-
知識點:掌握 selenium控制frame標簽的切換
3. selenium對cookie的處理
selenium能夠幫助我們處理頁面中的cookie,比如獲取、刪除,接下來我們就學習這部分知識
3.1 獲取cookie
driver.get_cookies()
返回列表,其中包含的是完整的cookie信息!不光有name、value,還有domain等cookie其他維度的信息。所以如果想要把獲取的cookie信息和requests模塊配合使用的話,需要轉換為name、value作為鍵值對的cookie字典
# 獲取當前標簽頁的全部cookie信息
print(driver.get_cookies())
# 把cookie轉化為字典
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
3.2 刪除cookie
#刪除一條cookie
driver.delete_cookie("CookieName")
# 刪除所有的cookie
driver.delete_all_cookies()
知識點:掌握 利用selenium獲取cookie的方法
4. selenium控制瀏覽器執行js代碼
selenium可以讓瀏覽器執行我們規定的js代碼,運行下列代碼查看運行效果
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.itcast.cn/")
time.sleep(1)
js = 'window.scrollTo(0,document.body.scrollHeight)' # js語句
driver.execute_script(js) # 執行js的方法
time.sleep(5)
driver.quit()
- 執行js的方法:
driver.execute_script(js)
知識點:掌握 selenium控制瀏覽器執行js代碼的方法
5. 頁面等待
頁面在加載的過程中需要花費時間等待網站服務器的響應,在這個過程中標簽元素有可能還沒有加載出來,是不可見的,如何處理這種情況呢?
- 頁面等待分類
- 強制等待介紹
- 顯式等待介紹
- 隱式等待介紹
- 手動實現頁面等待
5.1 頁面等待的分類
首先我們就來了解以下selenium頁面等待的分類
- 強制等待
- 隱式等待
- 顯式等待
5.2 強制等待(了解)
- 其實就是time.sleep()
- 缺點時不智能,設置的時間太短,元素還沒有加載出來;設置的時間太長,則會浪費時間
5.3 隱式等待
隱式等待針對的是元素定位,隱式等待設置了一個時間,在一段時間內判斷元素是否定位成功,如果完成了,就進行下一步
在設置的時間內沒有定位成功,則會報超時加載
-
示例代碼
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 隱式等待,最長等20秒 driver.get('https://www.baidu.com') driver.find_element_by_xpath()
5.4 顯式等待(了解)
每經過多少秒就查看一次等待條件是否達成,如果達成就停止等待,繼續執行后續代碼
如果沒有達成就繼續等待直到超過規定的時間后,報超時異常
-
示例代碼
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 driver = webdriver.Chrome() driver.get('https://www.baidu.com') # 顯式等待 WebDriverWait(driver, 20, 0.5).until( EC.presence_of_element_located((By.LINK_TEXT, '好123'))) # 參數20表示最長等待20秒 # 參數0.5表示0.5秒檢查一次規定的標簽是否存在 # EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通過鏈接文本內容定位標簽 # 每0.5秒一次檢查,通過鏈接文本內容定位標簽是否存在,如果存在就向下繼續執行;如果不存在,直到20秒上限就拋出異常 print(driver.find_element_by_link_text('好123').get_attribute('href')) driver.quit()
5.5 手動實現頁面等待
在了解了隱式等待和顯式等待以及強制等待后,我們發現并沒有一種通用的方法來解決頁面等待的問題,比如“頁面需要滑動才能觸發ajax異步加載”的場景,那么接下來我們就以淘寶網首頁為例,手動實現頁面等待
- 原理:
- 利用強制等待和顯式等待的思路來手動實現
- 不停的判斷或有次數限制的判斷某一個標簽對象是否加載完畢(是否存在)
- 實現代碼如下:
import time
from selenium import webdriver
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver.get('https://www.taobao.com/')
time.sleep(1)
# i = 0
# while True:
for i in range(10):
i += 1
try:
time.sleep(3)
element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')
print(element.get_attribute('href'))
break
except:
js = 'window.scrollTo(0, {})'.format(i*500) # js語句
driver.execute_script(js) # 執行js的方法
driver.quit()
知識點:掌握 手動實現頁面等待
6. selenium開啟無界面模式
絕大多數服務器是沒有界面的,selenium控制谷歌瀏覽器也是存在無界面模式的,這一小節我們就來學習如何開啟無界面模式(又稱之為無頭模式)
- 開啟無界面模式的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加開啟無界面模式的命令
options.add_argument("--headless")
- 配置對象添加禁用gpu的命令
options.add_argument("--disable-gpu")
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome(chrome_options=options)
- 實例化配置對象
- 注意:macos中chrome瀏覽器59+版本,Linux中57+版本才能使用無界面模式!
- 參考代碼如下:
from selenium import webdriver
options = webdriver.ChromeOptions() # 創建一個配置對象
options.add_argument("--headless") # 開啟無界面模式
options.add_argument("--disable-gpu") # 禁用gpu
# options.set_headles() # 無界面模式的另外一種開啟方式
driver = webdriver.Chrome(chrome_options=options) # 實例化帶有配置的driver對象
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()
知識點:掌握 selenium開啟無界面模式
7. selenium使用代理ip
selenium控制瀏覽器也是可以使用代理ip的!
-
使用代理ip的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加使用代理ip的命令
options.add_argument('--proxy-server=http://202.20.16.82:9527')
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實例化配置對象
-
參考代碼如下:
from selenium import webdriver options = webdriver.ChromeOptions() # 創建一個配置對象 options.add_argument('--proxy-server=http://202.20.16.82:9527') # 使用代理ip driver = webdriver.Chrome(chrome_options=options) # 實例化帶有配置的driver對象 driver.get('http://www.itcast.cn') print(driver.title) driver.quit()
知識點:了解 selenium使用代理ip
8. selenium替換user-agent
selenium控制谷歌瀏覽器時,User-Agent默認是谷歌瀏覽器的,這一小節我們就來學習使用不同的User-Agent
-
替換user-agent的方法
- 實例化配置對象
options = webdriver.ChromeOptions()
- 配置對象添加替換UA的命令
options.add_argument('--user-agent=Mozilla/5.0 HAHA')
- 實例化帶有配置對象的driver對象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實例化配置對象
-
參考代碼如下:
from selenium import webdriver options = webdriver.ChromeOptions() # 創建一個配置對象 options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 替換User-Agent driver = webdriver.Chrome('./chromedriver', chrome_options=options) driver.get('http://www.itcast.cn') print(driver.title) driver.quit()