Selenium 是一个用于自动化 Web 浏览器交互的强大工具,常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。
安装 Selenium
首先需要安装 Selenium 库和浏览器驱动:
pip install selenium
然后下载对应浏览器的驱动:
Chrome: ChromeDriver
Firefox: GeckoDriver
Edge: EdgeDriver
将驱动放在系统 PATH 路径中,或指定驱动路径。
基本使用
启动浏览器
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 使用 Chrome 浏览器
driver = webdriver.Chrome() # 或指定路径 webdriver.Chrome('/path/to/chromedriver')
# 使用 Firefox
# driver = webdriver.Firefox()
# 访问网页
driver.get("https://www.google.com")
常用操作
# 查找元素
search_box = driver.find_element(By.NAME, "q") # 通过name属性查找
# 输入内容
search_box.send_keys("Python Selenium")
# 模拟按键
search_box.send_keys(Keys.RETURN) # 回车
# 点击元素
button = driver.find_element(By.CSS_SELECTOR, "input[type='submit']")
button.click()
# 获取元素属性
print(button.get_attribute("value"))
# 获取文本内容
print(driver.find_element(By.TAG_NAME, "h1").text)
# 执行JavaScript
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 等待(隐式等待)
driver.implicitly_wait(10) # 最多等待10秒
# 显式等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
选择元素的方式
# 通过ID
driver.find_element(By.ID, "id_name")
# 通过name属性
driver.find_element(By.NAME, "name")
# 通过XPath
driver.find_element(By.XPATH, "//input[@name='q']")
# 通过链接文本
driver.find_element(By.LINK_TEXT, "Continue")
# 通过部分链接文本
driver.find_element(By.PARTIAL_LINK_TEXT, "Conti")
# 通过标签名
driver.find_element(By.TAG_NAME, "h1")
# 通过类名
driver.find_element(By.CLASS_NAME, "content")
# 通过CSS选择器
driver.find_element(By.CSS_SELECTOR, "p.content")
高级功能
处理弹窗和警告
# 获取并接受alert
alert = driver.switch_to.alert
print(alert.text)
alert.accept()
# 取消alert
alert.dismiss()
# 在prompt中输入文本
alert.send_keys("text")
alert.accept()
切换窗口和iframe
# 获取当前所有窗口句柄
all_handles = driver.window_handles
# 切换到新窗口
driver.switch_to.window(all_handles[1])
# 切换回原窗口
driver.switch_to.window(all_handles[0])
# 切换到iframe
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# 切回主文档
driver.switch_to.default_content()
处理下拉选择框
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
# 通过可见文本选择
select.select_by_visible_text("Option 1")
# 通过value属性选择
select.select_by_value("1")
# 通过索引选择
select.select_by_index(0)
浏览器操作
# 前进和后退
driver.forward()
driver.back()
# 刷新页面
driver.refresh()
# 获取当前URL
print(driver.current_url)
# 获取页面标题
print(driver.title)
# 获取页面源代码
print(driver.page_source)
# 设置窗口大小
driver.set_window_size(1024, 768)
# 最大化窗口
driver.maximize_window()
# 最小化窗口
driver.minimize_window()
# 全屏
driver.fullscreen_window()
截图和保存
# 截屏保存
driver.save_screenshot("screenshot.png")
# 获取元素截图
element = driver.find_element(By.TAG_NAME, "h1")
element.screenshot("element.png")
使用Cookies
# 获取所有cookies
print(driver.get_cookies())
# 添加cookie
driver.add_cookie({"name": "test", "value": "123"})
# 获取指定cookie
print(driver.get_cookie("test"))
# 删除cookie
driver.delete_cookie("test")
# 删除所有cookies
driver.delete_all_cookies()
无头模式
无头模式运行浏览器,不显示GUI界面:
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless") # 启用无头模式
options.add_argument("--disable-gpu") # 禁用GPU加速
driver = webdriver.Chrome(options=options)
关闭浏览器
# 关闭当前窗口
driver.close()
# 关闭所有窗口并退出浏览器
driver.quit() # 推荐使用,确保释放资源
实际示例:自动登录网站
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
# 初始化浏览器
driver = webdriver.Chrome()
try:
# 打开登录页面
driver.get("https://example.com/login")
# 输入用户名和密码
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
username.send_keys("your_username")
password.send_keys("your_password")
# 提交表单
password.send_keys(Keys.RETURN)
# 等待登录完成
time.sleep(2)
# 验证是否登录成功
if "Dashboard" in driver.title:
print("登录成功!")
else:
print("登录失败")
finally:
# 关闭浏览器
driver.quit()
注意事项
元素定位:确保使用稳定的定位方式,避免使用可能变化的XPath
等待机制:合理使用隐式和显式等待,避免硬性等待(time.sleep)
异常处理:添加try-except块处理可能的异常
资源释放:始终在finally块中调用driver.quit()释放资源
反爬措施:部分网站有反爬机制,需合理设置请求间隔和User-Agent