selenium的其它使用方法
1. selenium標(biāo)簽頁(yè)的切換
當(dāng)selenium控制瀏覽器打開(kāi)多個(gè)標(biāo)簽頁(yè)時(shí),如何控制瀏覽器在不同的標(biāo)簽頁(yè)中進(jìn)行切換呢?需要我們做以下兩步:
-
獲取所有標(biāo)簽頁(yè)的窗口句柄
-
利用窗口句柄字切換到句柄指向的標(biāo)簽頁(yè)
- 這里的窗口句柄是指:指向標(biāo)簽頁(yè)對(duì)象的標(biāo)識(shí)
- 關(guān)于句柄請(qǐng)課后了解更多,本小節(jié)不做展開(kāi)
-
具體的方法
# 1. 獲取當(dāng)前所有的標(biāo)簽頁(yè)的句柄構(gòu)成的列表 current_windows = driver.window_handles # 2. 根據(jù)標(biāo)簽頁(yè)句柄列表索引下標(biāo)進(jìn)行切換 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) # 通過(guò)執(zhí)行js來(lái)新開(kāi)一個(gè)標(biāo)簽頁(yè) js = 'window.open("https://www.sogou.com");' driver.execute_script(js) time.sleep(1) # 1. 獲取當(dāng)前所有的窗口 windows = driver.window_handles time.sleep(2) # 2. 根據(jù)窗口索引進(jìn)行切換 driver.switch_to.window(windows[0]) time.sleep(2) driver.switch_to.window(windows[1]) time.sleep(6) driver.quit()
知識(shí)點(diǎn):掌握 selenium控制標(biāo)簽頁(yè)的切換
2. switch_to切換frame標(biāo)簽
iframe是html中常用的一種技術(shù),即一個(gè)頁(yè)面中嵌套了另一個(gè)網(wǎng)頁(yè),selenium默認(rèn)是訪問(wèn)不了frame中的內(nèi)容的,對(duì)應(yīng)的解決思路是
driver.switch_to.frame(frame_element)
。接下來(lái)我們通過(guò)qq郵箱模擬登陸來(lái)學(xué)習(xí)這個(gè)知識(shí)點(diǎn)
-
參考代碼:
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') # 根據(jù)id定位 frame元素 driver.switch_to.frame(login_frame) # 轉(zhuǎn)向到該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()
-
總結(jié):
-
切換到定位的frame標(biāo)簽嵌套的頁(yè)面中
driver.switch_to.frame(通過(guò)find_element_by函數(shù)定位的frame、iframe標(biāo)簽對(duì)象)
-
利用切換標(biāo)簽頁(yè)的方式切出frame標(biāo)簽
-
windows = driver.window_handles driver.switch_to.window(windows[0])
-
-
知識(shí)點(diǎn):掌握 selenium控制frame標(biāo)簽的切換
3. selenium對(duì)cookie的處理
selenium能夠幫助我們處理頁(yè)面中的cookie,比如獲取、刪除,接下來(lái)我們就學(xué)習(xí)這部分知識(shí)
3.1 獲取cookie
driver.get_cookies()
返回列表,其中包含的是完整的cookie信息!不光有name、value,還有domain等cookie其他維度的信息。所以如果想要把獲取的cookie信息和requests模塊配合使用的話,需要轉(zhuǎn)換為name、value作為鍵值對(duì)的cookie字典
# 獲取當(dāng)前標(biāo)簽頁(yè)的全部cookie信息
print(driver.get_cookies())
# 把cookie轉(zhuǎn)化為字典
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()
知識(shí)點(diǎn):掌握 利用selenium獲取cookie的方法
4. selenium控制瀏覽器執(zhí)行js代碼
selenium可以讓瀏覽器執(zhí)行我們規(guī)定的js代碼,運(yùn)行下列代碼查看運(yùn)行效果
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語(yǔ)句
driver.execute_script(js) # 執(zhí)行js的方法
time.sleep(5)
driver.quit()
- 執(zhí)行js的方法:
driver.execute_script(js)
知識(shí)點(diǎn):掌握 selenium控制瀏覽器執(zhí)行js代碼的方法
5. 頁(yè)面等待
頁(yè)面在加載的過(guò)程中需要花費(fèi)時(shí)間等待網(wǎng)站服務(wù)器的響應(yīng),在這個(gè)過(guò)程中標(biāo)簽元素有可能還沒(méi)有加載出來(lái),是不可見(jiàn)的,如何處理這種情況呢?
- 頁(yè)面等待分類(lèi)
- 強(qiáng)制等待介紹
- 顯式等待介紹
- 隱式等待介紹
- 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
5.1 頁(yè)面等待的分類(lèi)
首先我們就來(lái)了解以下selenium頁(yè)面等待的分類(lèi)
- 強(qiáng)制等待
- 隱式等待
- 顯式等待
5.2 強(qiáng)制等待(了解)
- 其實(shí)就是time.sleep()
- 缺點(diǎn)時(shí)不智能,設(shè)置的時(shí)間太短,元素還沒(méi)有加載出來(lái);設(shè)置的時(shí)間太長(zhǎng),則會(huì)浪費(fèi)時(shí)間
5.3 隱式等待
-
隱式等待針對(duì)的是元素定位,隱式等待設(shè)置了一個(gè)時(shí)間,在一段時(shí)間內(nèi)判斷元素是否定位成功,如果完成了,就進(jìn)行下一步
-
在設(shè)置的時(shí)間內(nèi)沒(méi)有定位成功,則會(huì)報(bào)超時(shí)加載
-
示例代碼
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 隱式等待,最長(zhǎng)等20秒 driver.get('https://www.baidu.com') driver.find_element_by_xpath()
5.4 顯式等待(了解)
-
每經(jīng)過(guò)多少秒就查看一次等待條件是否達(dá)成,如果達(dá)成就停止等待,繼續(xù)執(zhí)行后續(xù)代碼
-
如果沒(méi)有達(dá)成就繼續(xù)等待直到超過(guò)規(guī)定的時(shí)間后,報(bào)超時(shí)異常
-
示例代碼
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'))) # 參數(shù)20表示最長(zhǎng)等待20秒 # 參數(shù)0.5表示0.5秒檢查一次規(guī)定的標(biāo)簽是否存在 # EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通過(guò)鏈接文本內(nèi)容定位標(biāo)簽 # 每0.5秒一次檢查,通過(guò)鏈接文本內(nèi)容定位標(biāo)簽是否存在,如果存在就向下繼續(xù)執(zhí)行;如果不存在,直到20秒上限就拋出異常 print(driver.find_element_by_link_text('好123').get_attribute('href')) driver.quit()
5.5 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
在了解了隱式等待和顯式等待以及強(qiáng)制等待后,我們發(fā)現(xiàn)并沒(méi)有一種通用的方法來(lái)解決頁(yè)面等待的問(wèn)題,比如“頁(yè)面需要滑動(dòng)才能觸發(fā)ajax異步加載”的場(chǎng)景,那么接下來(lái)我們就以淘寶網(wǎng)首頁(yè)為例,手動(dòng)實(shí)現(xiàn)頁(yè)面等待
- 原理:
- 利用強(qiáng)制等待和顯式等待的思路來(lái)手動(dòng)實(shí)現(xiàn)
- 不停的判斷或有次數(shù)限制的判斷某一個(gè)標(biāo)簽對(duì)象是否加載完畢(是否存在)
- 實(shí)現(xiàn)代碼如下:
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語(yǔ)句
driver.execute_script(js) # 執(zhí)行js的方法
driver.quit()
知識(shí)點(diǎn):掌握 手動(dòng)實(shí)現(xiàn)頁(yè)面等待
6. selenium開(kāi)啟無(wú)界面模式
絕大多數(shù)服務(wù)器是沒(méi)有界面的,selenium控制谷歌瀏覽器也是存在無(wú)界面模式的,這一小節(jié)我們就來(lái)學(xué)習(xí)如何開(kāi)啟無(wú)界面模式(又稱之為無(wú)頭模式)
- 開(kāi)啟無(wú)界面模式的方法
- 實(shí)例化配置對(duì)象
options = webdriver.ChromeOptions()
- 配置對(duì)象添加開(kāi)啟無(wú)界面模式的命令
options.add_argument("--headless")
- 配置對(duì)象添加禁用gpu的命令
options.add_argument("--disable-gpu")
- 實(shí)例化帶有配置對(duì)象的driver對(duì)象
driver = webdriver.Chrome(chrome_options=options)
- 實(shí)例化配置對(duì)象
- 注意:macos中chrome瀏覽器59+版本,Linux中57+版本才能使用無(wú)界面模式!
- 參考代碼如下:
from selenium import webdriver
options = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象
options.add_argument("--headless") # 開(kāi)啟無(wú)界面模式
options.add_argument("--disable-gpu") # 禁用gpu
# options.set_headles() # 無(wú)界面模式的另外一種開(kāi)啟方式
driver = webdriver.Chrome(chrome_options=options) # 實(shí)例化帶有配置的driver對(duì)象
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()
知識(shí)點(diǎn):掌握 selenium開(kāi)啟無(wú)界面模式
7. selenium使用代理ip
selenium控制瀏覽器也是可以使用代理ip的!
-
使用代理ip的方法
- 實(shí)例化配置對(duì)象
options = webdriver.ChromeOptions()
- 配置對(duì)象添加使用代理ip的命令
options.add_argument('--proxy-server=http://202.20.16.82:9527')
- 實(shí)例化帶有配置對(duì)象的driver對(duì)象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實(shí)例化配置對(duì)象
-
參考代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-824319.html
from selenium import webdriver options = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象 options.add_argument('--proxy-server=http://202.20.16.82:9527') # 使用代理ip driver = webdriver.Chrome(chrome_options=options) # 實(shí)例化帶有配置的driver對(duì)象 driver.get('http://www.itcast.cn') print(driver.title) driver.quit()
知識(shí)點(diǎn):了解 selenium使用代理ip
8. selenium替換user-agent
selenium控制谷歌瀏覽器時(shí),User-Agent默認(rèn)是谷歌瀏覽器的,這一小節(jié)我們就來(lái)學(xué)習(xí)使用不同的User-Agent
-
替換user-agent的方法文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-824319.html
- 實(shí)例化配置對(duì)象
options = webdriver.ChromeOptions()
- 配置對(duì)象添加替換UA的命令
options.add_argument('--user-agent=Mozilla/5.0 HAHA')
- 實(shí)例化帶有配置對(duì)象的driver對(duì)象
driver = webdriver.Chrome('./chromedriver', chrome_options=options)
- 實(shí)例化配置對(duì)象
-
參考代碼如下:
from selenium import webdriver options = webdriver.ChromeOptions() # 創(chuàng)建一個(gè)配置對(duì)象 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()
知識(shí)點(diǎn):了解 selenium替換user-agent
到了這里,關(guān)于selenium的其它使用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!