
Selenium常用代码速查手册
1. 基础配置
用法:导入必要的模块,初始化浏览器驱动
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
# 初始化Chrome浏览器(需要先下载chromedriver)
driver = webdriver.Chrome()
driver.maximize_window() # 最大化窗口
driver.implicitly_wait(10) # 设置隐式等待10秒
# 打开网页
driver.get("https://www.baidu.com")2. 元素定位
用法:在网页中找到你要操作的元素(按钮、输入框等)
# CSS选择器(推荐使用,最灵活)
element = driver.find_element(By.CSS_SELECTOR, "#id") # 通过id找元素
element = driver.find_element(By.CSS_SELECTOR, ".class") # 通过class找元素
element = driver.find_element(By.CSS_SELECTOR, "input[type='text']") # 通过属性找元素
# 其他定位方式
element = driver.find_element(By.ID, "element_id") # 直接通过id找
element = driver.find_element(By.CLASS_NAME, "class_name") # 通过class名找
element = driver.find_element(By.XPATH, "//div[@class='example']") # 通过xpath找
element = driver.find_element(By.TAG_NAME, "button") # 通过标签名找
element = driver.find_element(By.LINK_TEXT, "链接文本") # 通过链接文字找
element = driver.find_element(By.PARTIAL_LINK_TEXT, "部分链接") # 通过部分链接文字找
# 查找多个相同元素(返回列表)
elements = driver.find_elements(By.CSS_SELECTOR, ".item")3. 基本操作
用法:对找到的元素进行各种操作
# 点击元素(按钮、链接等)
element.click()
# 在输入框中输入文本
element.send_keys("要输入的文本")
# 清空输入框内容
element.clear()
# 获取元素显示的文本内容
text = element.text
print(text) # 打印获取的文本
# 获取元素的属性值(如value、href等)
value = element.get_attribute("value") # 获取输入框的值
href = element.get_attribute("href") # 获取链接地址
# 判断元素状态
is_displayed = element.is_displayed() # 元素是否可见
is_enabled = element.is_enabled() # 元素是否可用
is_selected = element.is_selected() # 元素是否被选中(复选框、单选框)4. 键盘操作
用法:模拟键盘按键,实现快捷键操作
# 组合键操作(常用于复制粘贴等)
element.send_keys(Keys.CONTROL, 'a') # Ctrl+A 全选文本
element.send_keys(Keys.CONTROL, 'c') # Ctrl+C 复制
element.send_keys(Keys.CONTROL, 'v') # Ctrl+V 粘贴
# 特殊按键
element.send_keys(Keys.ENTER) # 按回车键(提交表单)
element.send_keys(Keys.TAB) # 按Tab键(切换焦点)
element.send_keys(Keys.ESCAPE) # 按ESC键(取消操作)
element.send_keys(Keys.DELETE) # 按Delete键
element.send_keys(Keys.BACKSPACE) # 按退格键
element.send_keys(Keys.ARROW_UP) # 按方向键上
# 实用示例:清空输入框并输入新内容
input_box = driver.find_element(By.ID, "search")
input_box.send_keys(Keys.CONTROL, 'a') # 全选
input_box.send_keys(Keys.DELETE) # 删除
input_box.send_keys("新的搜索内容") # 输入新内容5. 鼠标操作
用法:模拟鼠标的各种操作
# 鼠标悬停(显示下拉菜单等)
ActionChains(driver).move_to_element(element).perform()
# 右键点击(显示右键菜单)
ActionChains(driver).context_click(element).perform()
# 双击元素
ActionChains(driver).double_click(element).perform()
# 拖拽元素从source到target位置
ActionChains(driver).drag_and_drop(source, target).perform()
# 拖拽元素到指定距离(x轴100像素,y轴0像素)
ActionChains(driver).click_and_hold(element).move_by_offset(100, 0).release().perform()
# 实用示例:滑动滑块
slider = driver.find_element(By.CSS_SELECTOR, ".slider")
ActionChains(driver).click_and_hold(slider).move_by_offset(50, 0).release().perform()6. 等待机制
用法:等待页面元素加载完成,避免操作失败
# 固定等待(简单但不推荐,会浪费时间)
sleep(2) # 等待2秒
# 显式等待(推荐使用,更智能)
wait = WebDriverWait(driver, 10) # 最多等待10秒
# 等待元素出现在DOM中
element = wait.until(EC.presence_of_element_located((By.ID, "myElement")))
# 等待元素可以被点击
element = wait.until(EC.element_to_be_clickable((By.ID, "myButton")))
# 等待元素可见
element = wait.until(EC.visibility_of_element_located((By.ID, "myDiv")))
# 等待元素消失(如加载动画)
wait.until(EC.invisibility_of_element_located((By.ID, "loading")))
# 实用示例:等待搜索结果加载
search_button = driver.find_element(By.ID, "search-btn")
search_button.click()
# 等待结果列表出现
results = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "results")))7. 下拉框操作
用法:操作HTML的select下拉框
from selenium.webdriver.support.ui import Select
# 找到下拉框并创建Select对象
dropdown = driver.find_element(By.ID, "country")
select = Select(dropdown)
# 三种选择方式
select.select_by_visible_text("中国") # 通过显示文本选择
select.select_by_value("china") # 通过value属性选择
select.select_by_index(1) # 通过索引选择(从0开始)
# 获取选项信息
all_options = select.options # 获取所有选项
selected_option = select.first_selected_option # 获取当前选中项
print(selected_option.text) # 打印选中项文本
# 取消选择(多选下拉框)
select.deselect_by_visible_text("中国")
select.deselect_all() # 取消所有选择8. 窗口和标签页
用法:处理多个浏览器窗口或标签页
# 保存当前窗口句柄(用于后续切换回来)
main_window = driver.current_window_handle
# 获取所有窗口句柄
all_windows = driver.window_handles
print(f"共有{len(all_windows)}个窗口")
# 点击链接打开新窗口后,切换到新窗口
link = driver.find_element(By.LINK_TEXT, "打开新窗口")
link.click()
# 切换到最新打开的窗口
driver.switch_to.window(driver.window_handles[-1])
# 用JavaScript打开新标签页
driver.execute_script("window.open('https://www.baidu.com');")
# 关闭当前窗口并切换回主窗口
driver.close()
driver.switch_to.window(main_window)
# 处理iframe框架
driver.switch_to.frame("frame_name") # 切换到iframe
driver.switch_to.frame(0) # 通过索引切换
driver.switch_to.default_content() # 切回主页面
# 实用示例:处理弹出窗口
original_window = driver.current_window_handle
# 点击按钮打开新窗口
driver.find_element(By.ID, "open-window").click()
# 等待新窗口出现
wait.until(lambda d: len(d.window_handles) > 1)
# 切换到新窗口
for window in driver.window_handles:
if window != original_window:
driver.switch_to.window(window)
break9. JavaScript执行
用法:执行JavaScript代码解决复杂操作
# 滚动页面到底部(加载更多内容)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到指定元素位置
element = driver.find_element(By.ID, "target")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 强制点击被遮挡的元素
hidden_button = driver.find_element(By.ID, "hidden-btn")
driver.execute_script("arguments[0].click();", hidden_button)
# 直接设置输入框的值(绕过输入限制)
input_box = driver.find_element(By.ID, "readonly-input")
driver.execute_script("arguments[0].value = '强制设置的值';", input_box)
# 修改元素样式(如显示隐藏元素)
driver.execute_script("arguments[0].style.display = 'block';", element)
# 获取页面信息
page_height = driver.execute_script("return document.body.scrollHeight;")
print(f"页面高度:{page_height}像素")
# 实用示例:无限滚动加载
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(2) # 等待加载
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break # 没有新内容了
last_height = new_height10. 文件操作
用法:处理文件上传和截图
# 文件上传(找到文件选择器并传入文件路径)
file_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
file_path = r"C:\Users\用户名\Desktop\要上传的文件.jpg"
file_input.send_keys(file_path)
# 多文件上传
files = [r"C:\file1.jpg", r"C:\file2.jpg"]
file_input.send_keys("\n".join(files))
# 整个页面截图
driver.save_screenshot("页面截图.png")
# 单个元素截图
element = driver.find_element(By.ID, "target")
element.screenshot("元素截图.png")
# 带时间戳的截图(避免文件名重复)
from datetime import datetime
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
driver.save_screenshot(f"截图_{timestamp}.png")
# 实用示例:自动化测试截图
def take_screenshot_on_error():
try:
# 执行测试步骤
driver.find_element(By.ID, "submit").click()
except Exception as e:
# 出错时自动截图
driver.save_screenshot("错误截图.png")
print(f"操作失败:{e}")11. 弹窗处理
用法:处理JavaScript弹出的对话框
# 等待弹窗出现并处理
try:
# 触发弹窗的操作
driver.find_element(By.ID, "alert-btn").click()
# 切换到弹窗
alert = driver.switch_to.alert
# 获取弹窗文本
alert_text = alert.text
print(f"弹窗内容:{alert_text}")
# 确认弹窗(点击确定)
alert.accept()
# 或者取消弹窗(点击取消)
# alert.dismiss()
except:
print("没有弹窗出现")
# 处理输入型弹窗(prompt)
try:
driver.find_element(By.ID, "prompt-btn").click()
alert = driver.switch_to.alert
alert.send_keys("要输入的文本") # 在弹窗中输入文本
alert.accept() # 确认
except:
print("没有输入弹窗")
# 实用示例:批量确认删除操作
delete_buttons = driver.find_elements(By.CLASS_NAME, "delete-btn")
for btn in delete_buttons:
btn.click()
# 等待确认弹窗
alert = WebDriverWait(driver, 5).until(lambda d: d.switch_to.alert)
alert.accept() # 确认删除12. Cookie操作
用法:管理浏览器Cookie,实现登录状态保持等
# 添加Cookie(通常用于模拟登录状态)
driver.add_cookie({
"name": "session_id",
"value": "abc123456",
"domain": "example.com"
})
# 获取指定Cookie
session_cookie = driver.get_cookie("session_id")
if session_cookie:
print(f"会话ID:{session_cookie['value']}")
# 获取所有Cookie
all_cookies = driver.get_cookies()
for cookie in all_cookies:
print(f"{cookie['name']}: {cookie['value']}")
# 删除指定Cookie
driver.delete_cookie("session_id")
# 删除所有Cookie(退出登录)
driver.delete_all_cookies()
# 实用示例:保存和恢复登录状态
import json
# 登录后保存Cookie
def save_cookies():
with open("cookies.json", "w") as f:
json.dump(driver.get_cookies(), f)
# 下次访问时恢复Cookie
def load_cookies():
try:
with open("cookies.json", "r") as f:
cookies = json.load(f)
for cookie in cookies:
driver.add_cookie(cookie)
driver.refresh() # 刷新页面使Cookie生效
except FileNotFoundError:
print("没有保存的Cookie文件")13. 浏览器控制
用法:控制浏览器的基本行为
# 页面导航
driver.get("https://www.baidu.com") # 打开网页
driver.back() # 后退到上一页
driver.forward() # 前进到下一页
driver.refresh() # 刷新当前页面
# 窗口大小控制
driver.maximize_window() # 最大化窗口
driver.minimize_window() # 最小化窗口
driver.set_window_size(1920, 1080) # 设置窗口大小
driver.fullscreen_window() # 全屏模式
# 获取窗口大小和位置
size = driver.get_window_size()
print(f"窗口大小:{size['width']} x {size['height']}")
position = driver.get_window_position()
print(f"窗口位置:({position['x']}, {position['y']})")
# 获取页面信息
title = driver.title # 获取页面标题
url = driver.current_url # 获取当前URL
page_source = driver.page_source # 获取页面源码
print(f"页面标题:{title}")
print(f"当前网址:{url}")
# 实用示例:检查页面是否正确加载
def check_page_loaded(expected_title):
actual_title = driver.title
if expected_title in actual_title:
print("页面加载成功")
return True
else:
print(f"页面加载异常,期望标题包含:{expected_title},实际标题:{actual_title}")
return False
# 设置浏览器位置(多显示器环境)
driver.set_window_position(0, 0) # 移动到左上角14. 常用操作模式
用法:封装常用的操作组合,提高代码复用性
# 清空输入框并输入新内容(最常用)
def input_text(element, text):
element.click() # 点击激活输入框
element.send_keys(Keys.CONTROL, 'a') # 全选现有内容
element.send_keys(Keys.DELETE) # 删除内容
element.send_keys(text) # 输入新内容
# 使用示例
search_box = driver.find_element(By.ID, "search")
input_text(search_box, "Python教程")
# 等待并点击(避免元素未加载完成)
def wait_and_click(driver, selector, timeout=10):
element = WebDriverWait(driver, timeout).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, selector))
)
element.click()
return element
# 使用示例
wait_and_click(driver, "#submit-btn")
# 滚动到元素并点击(处理页面很长的情况)
def scroll_and_click(driver, element):
driver.execute_script("arguments[0].scrollIntoView();", element)
sleep(0.5) # 等待滚动完成
element.click()
# 安全点击(多种点击方式的组合)
def safe_click(driver, element):
try:
element.click() # 尝试普通点击
except ElementClickInterceptedException:
# 如果被遮挡,用JS点击
driver.execute_script("arguments[0].click();", element)
# 批量操作示例
def batch_delete_items():
items = driver.find_elements(By.CLASS_NAME, "item")
for item in items:
delete_btn = item.find_element(By.CLASS_NAME, "delete")
safe_click(driver, delete_btn)
sleep(1) # 等待删除完成15. 异常处理
用法:处理自动化过程中的各种异常情况
from selenium.common.exceptions import *
# 基本异常处理
try:
element = driver.find_element(By.ID, "submit")
element.click()
except NoSuchElementException:
print("找不到提交按钮,可能页面结构发生变化")
except TimeoutException:
print("页面加载超时,网络可能有问题")
except ElementClickInterceptedException:
print("按钮被其他元素遮挡,尝试滚动页面")
except StaleElementReferenceException:
print("元素引用已失效,需要重新查找元素")
# 完整的异常处理示例
def robust_click(driver, selector, max_retries=3):
"""健壮的点击函数,包含重试机制"""
for attempt in range(max_retries):
try:
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, selector))
)
element.click()
return True # 成功点击
except TimeoutException:
print(f"第{attempt+1}次尝试:等待元素超时")
except ElementClickInterceptedException:
print(f"第{attempt+1}次尝试:元素被遮挡,尝试滚动")
driver.execute_script("window.scrollBy(0, 200);")
except Exception as e:
print(f"第{attempt+1}次尝试:未知错误 {e}")
if attempt < max_retries - 1:
sleep(2) # 重试前等待
print("所有尝试都失败了")
return False
# 使用示例
if robust_click(driver, "#difficult-button"):
print("成功点击按钮")
else:
print("点击失败,需要人工检查")16. 性能优化
用法:提高自动化脚本的运行速度和稳定性
# Chrome浏览器性能优化配置
chrome_options = webdriver.ChromeOptions()
# 禁用图片加载(大幅提升速度)
chrome_options.add_argument('--blink-settings=imagesEnabled=false')
# 无头模式(不显示浏览器界面,速度更快)
chrome_options.add_argument('--headless')
# 禁用GPU加速(避免某些环境下的问题)
chrome_options.add_argument('--disable-gpu')
# 禁用开发者工具
chrome_options.add_argument('--disable-dev-shm-usage')
# 设置页面加载策略(不等待所有资源加载完成)
chrome_options.add_argument('--page-load-strategy=eager')
# 禁用扩展
chrome_options.add_argument('--disable-extensions')
# 禁用通知
chrome_options.add_argument('--disable-notifications')
# 创建优化后的驱动
driver = webdriver.Chrome(options=chrome_options)
# 设置较短的页面加载超时
driver.set_page_load_timeout(30) # 30秒超时
# 实用示例:批量处理时的优化
def optimized_batch_process():
# 使用无头模式进行批量处理
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-images')
driver = webdriver.Chrome(options=options)
urls = ["http://example1.com", "http://example2.com"]
results = []
for url in urls:
driver.get(url)
# 快速获取需要的信息
title = driver.title
results.append(title)
driver.quit()
return results17. 调试技巧
用法:帮助定位和解决自动化脚本中的问题
# 高亮显示元素(方便调试时查看)
def highlight_element(driver, element, color="red", width=3):
"""高亮显示元素"""
original_style = element.get_attribute("style")
driver.execute_script(
f"arguments[0].style.border='{width}px solid {color}';",
element
)
sleep(2) # 显示2秒
# 恢复原始样式
driver.execute_script(f"arguments[0].style='{original_style}';", element)
# 获取元素详细信息
def get_element_info(element):
"""获取元素的详细信息用于调试"""
info = {
"tag_name": element.tag_name,
"text": element.text,
"location": element.location,
"size": element.size,
"is_displayed": element.is_displayed(),
"is_enabled": element.is_enabled()
}
return info
# 使用示例
button = driver.find_element(By.ID, "submit")
print("按钮信息:", get_element_info(button))
highlight_element(driver, button) # 高亮显示按钮
# 检查元素是否在视口内
def is_element_in_viewport(driver, element):
"""检查元素是否在当前视口内"""
return driver.execute_script("""
var rect = arguments[0].getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= window.innerHeight &&
rect.right <= window.innerWidth
);
""", element)
# 调试模式运行(添加详细日志)
def debug_click(driver, selector):
"""调试版本的点击函数"""
print(f"正在查找元素:{selector}")
try:
element = driver.find_element(By.CSS_SELECTOR, selector)
print(f"找到元素:{element.tag_name}")
if not element.is_displayed():
print("警告:元素不可见")
if not element.is_enabled():
print("警告:元素不可用")
if not is_element_in_viewport(driver, element):
print("元素不在视口内,滚动到元素位置")
driver.execute_script("arguments[0].scrollIntoView();", element)
highlight_element(driver, element) # 高亮显示
element.click()
print("成功点击元素")
except Exception as e:
print(f"点击失败:{e}")
driver.save_screenshot("debug_error.png") # 出错时截图18. 移动端测试
用法:模拟移动设备进行测试
# 模拟不同移动设备
mobile_devices = {
"iPhone X": {"deviceName": "iPhone X"},
"iPad": {"deviceName": "iPad"},
"Galaxy S5": {"deviceName": "Galaxy S5"},
"自定义": {
"deviceMetrics": {
"width": 375,
"height": 667,
"pixelRatio": 2.0
},
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X)"
}
}
# 创建移动端浏览器
def create_mobile_driver(device="iPhone X"):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option(
"mobileEmulation",
mobile_devices[device]
)
return webdriver.Chrome(options=chrome_options)
# 使用示例
mobile_driver = create_mobile_driver("iPhone X")
mobile_driver.get("https://m.baidu.com")
# 触摸操作(注意:TouchActions在新版本中已弃用)
# 推荐使用ActionChains进行移动端操作
def mobile_swipe(driver, start_x, start_y, end_x, end_y):
"""模拟手机滑动操作"""
ActionChains(driver)\
.move_by_offset(start_x, start_y)\
.click_and_hold()\
.move_by_offset(end_x - start_x, end_y - start_y)\
.release()\
.perform()
# 移动端特有操作示例
def mobile_test_example():
driver = create_mobile_driver("iPhone X")
driver.get("https://m.taobao.com")
# 模拟向下滑动加载更多
for i in range(3):
driver.execute_script("window.scrollBy(0, 500);")
sleep(2)
# 检查移动端特有元素
try:
menu_btn = driver.find_element(By.CLASS_NAME, "mobile-menu")
menu_btn.click()
print("成功打开移动端菜单")
except:
print("未找到移动端菜单")
driver.quit()
# 响应式测试(测试不同屏幕尺寸)
def responsive_test():
driver = webdriver.Chrome()
# 测试不同分辨率
resolutions = [
(1920, 1080), # 桌面
(1366, 768), # 笔记本
(768, 1024), # 平板
(375, 667) # 手机
]
for width, height in resolutions:
driver.set_window_size(width, height)
driver.get("https://example.com")
# 检查布局是否正常
title = driver.title
print(f"分辨率 {width}x{height}: {title}")
# 截图保存
driver.save_screenshot(f"responsive_{width}x{height}.png")
sleep(2)
driver.quit()
评论 (0)