文章目录
-
- 一、环境安装
- 二、最小Demo:打开网页,搜索(可直接运行)
- 三、元素定位(Selenium4标准写法,重点)
- 四、等待机制(解决页面JS异步加载,最容易踩坑)
-
- [1. 隐式等待(全局,不推荐复杂页面)](#1. 隐式等待(全局,不推荐复杂页面))
- [2. 显式等待(项目推荐,精准等待目标元素)](#2. 显式等待(项目推荐,精准等待目标元素))
- 五、元素常用操作
- 六、浏览器常用操作
- 七、iframe、多窗口切换(高频坑点)
- 八、无头模式(后台运行浏览器,不弹出窗口,服务器部署)
- 九、异常处理
- 十、实战小项目:页面自动截图采集(贴合你业务监控场景)
一、环境安装
bash
pip install selenium webdriver-manager
- selenium:核心库
- webdriver-manager:自动识别Chrome版本,下载匹配驱动,省去手动配置驱动的麻烦
二、最小Demo:打开网页,搜索(可直接运行)
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 启动Chrome浏览器
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
# 访问网页
driver.get("https://www.baidu.com")
# 定位搜索框,输入文字,回车
search_input = driver.find_element(By.ID, "kw")
search_input.clear()
search_input.send_keys("Selenium教程")
search_input.send_keys(Keys.ENTER)
# 打印页面标题
print(driver.title)
# 关闭浏览器
driver.quit()
三、元素定位(Selenium4标准写法,重点)
Selenium4不再支持旧版
find_element_by_id,统一使用find_element(By.xxx, 值)
find_element:返回单个元素,找不到直接报错;find_elements:返回元素列表,找不到返回空列表
| 定位方式 | 代码示例 | 适用场景 |
|---|---|---|
| By.ID | driver.find_element(By.ID,"kw") |
优先用,id唯一,最稳定 |
| By.NAME | driver.find_element(By.NAME,"wd") |
表单name属性 |
| By.CLASS_NAME | driver.find_element(By.CLASS_NAME,"s_ipt") |
单个class名称 |
| By.CSS_SELECTOR | driver.find_element(By.CSS_SELECTOR,"input[class='s_ipt']") |
最常用,层级、属性模糊匹配 |
| By.XPATH | driver.find_element(By.XPATH,"//input[@id='kw']") |
按文本匹配、向上查找父节点 |
| By.LINK_TEXT | driver.find_element(By.LINK_TEXT,"新闻") |
a标签完整链接文本 |
| By.PARTIAL_LINK_TEXT | driver.find_element(By.PARTIAL_LINK_TEXT,"新") |
a标签部分文本 |
| By.TAG_NAME | driver.find_element(By.TAG_NAME,"input") |
标签名批量查找 |
定位优先级:ID > CSS > XPath;XPath适合需要根据页面文本定位场景
四、等待机制(解决页面JS异步加载,最容易踩坑)
1. 隐式等待(全局,不推荐复杂页面)
全局设置最大等待时长,查找元素时最多等待指定秒数,找到就继续
python
driver.implicitly_wait(5)
2. 显式等待(项目推荐,精准等待目标元素)
只针对指定元素等待,性能更好,避免固定sleep
python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 最多等待10秒,直到元素可点击
ele = WebDriverWait(driver,10).until(
EC.element_to_be_clickable((By.ID,"kw"))
)
常用EC条件:
presence_of_element_located:元素DOM存在visibility_of_element_located:元素可见element_to_be_clickable:元素可点击text_to_be_present_in_element:判断元素包含指定文本
❌ 尽量少用
time.sleep()硬等待,不稳定、效率低
五、元素常用操作
python
# 输入内容
ele.send_keys("输入文字")
# 清空输入框
ele.clear()
# 点击
ele.click()
# 获取元素文本
text = ele.text
# 获取属性值
attr = ele.get_attribute("href")
# 判断是否可见
ele.is_displayed()
# 判断是否启用
ele.is_enabled()
键盘按键:Keys.ENTER回车、Keys.BACK_SPACE退格、Keys.CONTROL+'a'全选
六、浏览器常用操作
python
driver.get("url") # 打开页面
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新页面
driver.title # 获取网页标题
driver.page_source # 获取网页源码
driver.current_url # 获取当前url
driver.maximize_window() # 窗口最大化
driver.save_screenshot("page.png") # 页面截图
JS执行(滚动页面、修改页面数据)
python
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到指定元素
driver.execute_script("arguments[0].scrollIntoView();", ele)
七、iframe、多窗口切换(高频坑点)
- iframe嵌套页面:元素在iframe内部,必须切换frame才能定位
python
# 切换到iframe
driver.switch_to.frame("iframe_id")
# 切回主页面
driver.switch_to.default_content()
- 多标签页切换
python
# 获取所有窗口句柄
windows = driver.window_handles
# 切换到第二个标签
driver.switch_to.window(windows[1])
八、无头模式(后台运行浏览器,不弹出窗口,服务器部署)
python
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless=new") # 无头
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
九、异常处理
常见异常:
NoSuchElementException:找不到元素TimeoutException:等待超时ElementClickInterceptedException:元素被遮挡无法点击
python
from selenium.common.exceptions import TimeoutException, NoSuchElementException
try:
ele = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"kw")))
ele.click()
except TimeoutException:
print("元素等待超时")
except NoSuchElementException:
print("元素不存在")
十、实战小项目:页面自动截图采集(贴合你业务监控场景)
场景:访问业务页面,等待页面加载完成,截图保存,用于页面快照监控
python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
try:
driver.get("https://xxx业务页面")
# 等待页面核心元素加载完成
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID,"main-container")))
driver.save_screenshot("business_page.png")
print("页面截图保存成功")
finally:
driver.quit()