15.selenium的其它使用方法

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. 頁面等待

頁面在加載的過程中需要花費時間等待網站服務器的響應,在這個過程中標簽元素有可能還沒有加載出來,是不可見的,如何處理這種情況呢?

  1. 頁面等待分類
  2. 強制等待介紹
  3. 顯式等待介紹
  4. 隱式等待介紹
  5. 手動實現頁面等待

5.1 頁面等待的分類

首先我們就來了解以下selenium頁面等待的分類

  1. 強制等待
  2. 隱式等待
  3. 顯式等待

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()
    

知識點:了解 selenium替換user-agent

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。