前言
環境: win10 python3.10 selenium4.12
經常用selenium來實現一個開啟網頁的這樣一個小功能,雖然程式碼很少,但每次從0開始寫就很煩。所以這裡記錄下一個模板
小模板
以百度搜尋為例
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from loguru import logger
# 使用selenium開啟網頁的最小程式碼結構模板
# selenium 版本4.21
# 設定chrome選項
chrome_options = Options()
chrome_options.add_argument("--start-maximized") #最大化視窗
# 配置自動下載合適版本的webdriver驅動
service = Service(ChromeDriverManager().install())
"""
# 不自動下載,手動設定webdriver路徑,以chromediver為例
chromedriver_path = r"E:\xxxxx\chromedriver.exe" # 這裡替換為你下載的webdriver的路徑
service = Service(chromedriver_path)
"""
try:
#第一層的try語句主要是防止webdiver開啟瀏覽器出錯,如驅動不匹配或未找到出現的異常
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
#第二層的try語句作用是,在成功開啟瀏覽器後,若出現其它異常,能確保關閉瀏覽器
# 開啟目標網站 這裡以百度首頁為例
driver.get('https://www.baidu.com/')
# 以下是一些selenium的使用示例
try:
# 設定顯示等待來等待指定元素,最長等待時間7s
#未在規定時間內滿足指定的等待條件,則丟擲異常TimeoutException
wait = WebDriverWait(driver, 7)
# 透過id的定位方式等待百度輸入框的出現
wait.until(EC.presence_of_element_located((By.ID, "kw")))
# 透過id的定位方式等待百度一下按鈕的出現
wait.until(EC.presence_of_element_located((By.ID, "su")))
except TimeoutException as e:
logger.info(f'未在規定時間內滿足指定的等待條件: {e}')
raise
except Exception as e:
logger.info(f'等待中出現其它異常: {e}')
raise
# 百度首頁輸入框
input = driver.find_element(By.ID, 'kw')
# 輸入框輸入文字資料
input.send_keys("1")
#百度首頁 百度一下 按鈕
baidu_buton = driver.find_element(By.ID, "su")
# 點選按鈕
baidu_buton.click()
# 強制等待多少時間
time.sleep(2)
except Exception as e:
logger.info(f"發生異常 稍後關閉瀏覽器: {e}")
raise
finally:
#關閉瀏覽器
driver.quit()
except Exception as e:
logger.info(f"webdiver開啟瀏覽器前發生異常: {e}")
raise
關於顯示等待和隱式等待
# 顯示等待的例子,用其來等待元素載入,針對於特定的元素起作用
#如果未在規定的最長等待時間內滿足指定的等待條件,則會丟擲異常TimeoutException
## 最長等待時間10s
wait = WebDriverWait(driver, 10)
## 等待條件-等待元素出現在DOM中
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'xxxx')))
## 等待條件-等待元素可點選
wait.until(EC.element_to_be_clickable((By.ID, "xxxx")))
## 等待條件-等待元素中的文字出現
wait.until(EC.text_to_be_present_in_element((By.ID, "xxxx"), "expected_text"))
# 隱式等待的例子
##設定隱式等待時間為10秒,它在整個webdriver例項生命週期內起作用(也就是webdriver成功開啟瀏覽器後到 瀏覽器關閉期間)
##期間在查詢每一個元素時都自動受到該等待設定的影響
driver.implicitly_wait(10)
"""
在實際專案中,你可以綜合使用隱式等待和顯示等待。隱式等待可以作為全域性預設的等待機制
而顯示等待可以用於處理特定的複雜場景
"""
#強制等待多少時間
time.sleep(2)