Selenium 浏览器操作:掌控你的浏览器实例 - 详解

一、浏览器窗口操作

1. 获取和设置浏览器窗口大小

from selenium import webdriver
driver = webdriver.Chrome()
# 获取当前窗口尺寸
size = driver.get_window_size()
print(f"窗口宽度: {size['width']}, 窗口高度: {size['height']}")
# 设置窗口为特定大小
driver.set_window_size(1024, 768)
# 最大化窗口(常用)
driver.maximize_window()
# 最小化窗口(将浏览器最小化到任务栏)
driver.minimize_window()
# 全屏窗口(类似于F11全屏模式)
driver.fullscreen_window()

2. 获取和设置窗口位置

# 获取窗口位置
position = driver.get_window_position()
print(f"窗口X坐标: {position['x']}, 窗口Y坐标: {position['y']}")
# 设置窗口位置
driver.set_window_position(100, 200)

3. 截图功能

# 截取整个屏幕并保存为文件
driver.save_screenshot("screenshot.png")
# 截取当前窗口(不包含浏览器边框和任务栏)
driver.get_screenshot_as_file("window_screenshot.png")
# 获取截图二进制数据(用于直接处理而不保存文件)
screenshot_data = driver.get_screenshot_as_png()
# 获取base64编码的截图(适用于网页显示)
screenshot_base64 = driver.get_screenshot_as_base64()

二、导航控制

1. 基本页面导航

# 打开网页
driver.get("https://www.example.com")
# 获取当前URL
current_url = driver.current_url
print(f"当前页面URL: {current_url}")
# 获取页面标题
page_title = driver.title
print(f"页面标题: {page_title}")
# 刷新页面
driver.refresh()
# 前进(在浏览历史中前进)
driver.forward()
# 后退(在浏览历史中后退)
driver.back()

2. 页面源码和页面状态

# 获取页面完整HTML源码
page_source = driver.page_source
# 检查页面是否完全加载(返回True/False)
is_loaded = driver.execute_script("return document.readyState") == "complete"

三、窗口和标签页管理

1. 获取当前窗口句柄

# 获取当前窗口的句柄(唯一标识符)
main_window = driver.current_window_handle
print(f"当前窗口句柄: {main_window}")
# 获取所有打开窗口的句柄
all_windows = driver.window_handles
print(f"所有窗口句柄: {all_windows}")

2. 切换窗口和标签页

# 打开新标签页
driver.execute_script("window.open('');")
# 获取所有窗口句柄
windows = driver.window_handles
# 切换到新打开的标签页
driver.switch_to.window(windows[1])
# 在新标签页中导航
driver.get("https://www.google.com")
# 切换回原始标签页
driver.switch_to.window(windows[0])
# 关闭当前标签页/窗口
driver.close()
# 注意:关闭窗口后需要切换回其他窗口,否则会报错
driver.switch_to.window(windows[0])

3. 打开特定链接在新窗口

# 获取当前窗口句柄
main_window = driver.current_window_handle
# 找到需要在新窗口打开的链接
link = driver.find_element(By.LINK_TEXT, "Open in New Window")
# 使用ActionChains模拟右键点击并在新窗口打开
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
action = ActionChains(driver)
action.key_down(Keys.CONTROL).click(link).key_up(Keys.CONTROL).perform()
# 等待新窗口打开并切换
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
windows = driver.window_handles
driver.switch_to.window(windows[1])
# 操作新窗口...
# ...
# 关闭新窗口并切换回主窗口
driver.close()
driver.switch_to.window(main_window)

四、浏览器信息与配置

1. 获取浏览器信息

# 获取浏览器名称
browser_name = driver.name
print(f"浏览器名称: {browser_name}")
# 获取浏览器版本等信息
capabilities = driver.capabilities
print(f"浏览器版本: {capabilities['browserVersion']}")
print(f"平台信息: {capabilities['platformName']}")

2. Cookie 管理

# 导航到网站
driver.get("https://www.example.com")
# 添加Cookie
driver.add_cookie({"name": "test_cookie", "value": "cookie_value", "domain": "example.com"})
# 获取指定Cookie
cookie = driver.get_cookie("test_cookie")
print(f"获取的Cookie: {cookie}")
# 获取所有Cookies
all_cookies = driver.get_cookies()
print(f"所有Cookies: {all_cookies}")
# 删除指定Cookie
driver.delete_cookie("test_cookie")
# 删除所有Cookies
driver.delete_all_cookies()

3. 本地存储管理

# 执行JavaScript操作LocalStorage
driver.execute_script("window.localStorage.setItem('key', 'value');")
# 获取LocalStorage值
value = driver.execute_script("return window.localStorage.getItem('key');")
print(f"LocalStorage值: {value}")
# 执行JavaScript操作SessionStorage
driver.execute_script("window.sessionStorage.setItem('session_key', 'session_value');")
# 清除LocalStorage
driver.execute_script("window.localStorage.clear();")
# 清除SessionStorage
driver.execute_script("window.sessionStorage.clear();")

五、高级浏览器操作

1. 执行 JavaScript

# 执行简单的JavaScript
driver.execute_script("alert('Hello Selenium!');")
# 执行JavaScript并返回值
title = driver.execute_script("return document.title;")
print(f"通过JS获取的标题: {title}")
# 滚动页面
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到页面顶部
driver.execute_script("window.scrollTo(0, 0);")
# 滚动到特定元素
element = driver.find_element(By.ID, "my-element")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 修改元素样式
driver.execute_script("arguments[0].style.border = '3px solid red';", element)

2. 浏览器日志

# 获取浏览器日志(需要配置浏览器选项)
from selenium.webdriver.common.logging import LogType
# 启用浏览器日志记录(以Chrome为例)
options = webdriver.ChromeOptions()
options.set_capability("goog:loggingPrefs", {"browser": "ALL"})
driver = webdriver.Chrome(options=options)
# 获取日志
logs = driver.get_log(LogType.BROWSER)
for log in logs:
print(f"{log['level']}: {log['message']}")

3. 网络条件模拟

from selenium.webdriver.common.network_conditions import NetworkConditions
# 模拟网络条件(Chrome特有)
network_conditions = NetworkConditions()
network_conditions.download_throughput = 500 * 1024  # 500 KB/s
network_conditions.upload_throughput = 500 * 1024    # 500 KB/s
network_conditions.latency = 20  # 20ms
driver.set_network_conditions(network_conditions)
# 重置为默认网络条件
driver.delete_network_conditions()

六、实战示例:多窗口自动化

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.maximize_window()  # 最大化窗口
wait = WebDriverWait(driver, 10)
try:
# 打开主页面
driver.get("https://www.wikipedia.org")
# 获取主窗口句柄
main_window = driver.current_window_handle
# 点击一个会在新窗口打开的链接
link = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "English")))
link.click()
# 等待新窗口打开
wait.until(EC.number_of_windows_to_be(2))
# 获取所有窗口句柄并切换到新窗口
windows = driver.window_handles
for window in windows:
if window != main_window:
driver.switch_to.window(window)
break
# 在新窗口中操作
print(f"新窗口标题: {driver.title}")
search_box = wait.until(EC.visibility_of_element_located((By.ID, "searchInput")))
search_box.send_keys("Selenium (software)")
search_button = driver.find_element(By.ID, "searchButton")
search_button.click()
# 等待搜索结果加载
wait.until(EC.title_contains("Selenium"))
# 截图保存
driver.save_screenshot("wikipedia_search_result.png")
# 关闭当前窗口(新窗口)
driver.close()
# 切换回主窗口
driver.switch_to.window(main_window)
print(f"回到主窗口: {driver.title}")
finally:
driver.quit()

七、浏览器选项和功能

1. 常用浏览器选项(以Chrome为例)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建选项对象
chrome_options = Options()
# 常用配置
chrome_options.add_argument("--start-maximized")  # 启动时最大化
chrome_options.add_argument("--disable-infobars")  # 禁用"Chrome正在受到自动软件控制"的信息栏
chrome_options.add_argument("--incognito")  # 无痕模式
chrome_options.add_argument("--headless")  # 无头模式(不显示浏览器界面)
chrome_options.add_argument("--disable-gpu")  # 禁用GPU加速
chrome_options.add_argument("--no-sandbox")  # 禁用沙盒模式
chrome_options.add_argument("--disable-dev-shm-usage")  # 解决Linux下的共享内存问题
# 实验性选项
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])  # 禁用自动化提示
chrome_options.add_experimental_option('useAutomationExtension', False)  # 禁用自动化扩展
# 设置下载路径
prefs = {
"download.default_directory": "/path/to/download/dir",
"download.prompt_for_download": False,
"download.directory_upgrade": True
}
chrome_options.add_experimental_option("prefs", prefs)
# 使用选项创建浏览器实例
driver = webdriver.Chrome(options=chrome_options)

2. 移动设备模拟

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 模拟移动设备
mobile_emulation = {
"deviceMetrics": {"width": 375, "height": 812, "pixelRatio": 3.0},
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0 Mobile/15E148 Safari/604.1"
}
chrome_options = Options()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.example.com")

八、最佳实践总结

  1. 合理使用窗口管理:在多窗口场景中,确保正确切换和关闭窗口

  2. 利用截图功能:在关键步骤截图,便于调试和记录

  3. 谨慎使用无头模式:开发时使用正常模式便于调试,生产环境可考虑无头模式

  4. 合理配置浏览器选项:根据需求配置浏览器,提升自动化效率和稳定性

  5. 管理Cookie和本地存储:正确处理用户状态和数据

  6. 善用JavaScript执行:解决一些Selenium原生方法难以处理的情况

posted @ 2025-09-07 12:17  wzzkaifa  阅读(31)  评论(0)    收藏  举报