9 个浏览器操作专题 · 含交互式面板与 Selenium 参考答案
本页面提供 9 个浏览器操作模块 的完整练习场景,覆盖 Selenium 核心 API:浏览器参数配置、打开关闭、页面导航、窗口控制、页面信息、元素交互、Cookie 管理、截图、超时与等待。
每个模块均包含 练习要求描述卡(概念标签 + Selenium API 标签 + 练习要点清单 + 快速参考代码块)和 效果展示区域,点击下方卡片可跳转到对应练习,或按顺序逐个闯关。
webdriver.Chrome / Options.add_argument / driver.execute_script / driver.get_window_size
# 快速参考 from selenium.webdriver.chrome.options import Options from selenium import webdriver opts = Options() opts.add_argument("--headless=new") opts.add_argument("--user-agent=MyAgent/5.0") opts.add_argument("--window-size=1280,720") driver = webdriver.Chrome(options=opts) assert "MyAgent" in driver.execute_script('return navigator.userAgent') driver.quit()
Options() 创建配置对象,add_argument("--headless=new") 启动无界面浏览器,验证无窗口模式下 get() 与断言仍可正常执行add_argument("--user-agent=MyAgent/5.0") 后,用 driver.execute_script('return navigator.userAgent') 断言返回值包含自定义 UAadd_argument("--window-size=1280,720") 启动浏览器,用 get_window_size() 断言 width=1280、height=720
操作步骤:
① 使用 ChromeOptions 添加 --headless 参数启动无头浏览器;
② 使用 add_argument('--user-agent=XXX') 设置自定义 UA 并断言 driver.execute_script('return navigator.userAgent') 包含该值;
③ 使用 --window-size=1280,720 启动时设尺寸,断言 driver.get_window_size() 匹配。
💡 提示:在 Selenium 中通过 Options() 对象统一管理所有启动参数,webdriver.Chrome(options=opts) 传入即可。
# 练习 1 参考答案 from selenium import webdriver from selenium.webdriver.chrome.options import Options # 1. 创建 Options 对象 opts = Options() # ① 无头模式 opts.add_argument("--headless=new") # ② 自定义 User-Agent custom_ua = "Mozilla/5.0 (CustomAgent) SeleniumPractice/5.0" opts.add_argument(f"--user-agent={custom_ua}") # ③ 启动时窗口尺寸 opts.add_argument("--window-size=1280,720") # 2. 启动浏览器(传入配置) driver = webdriver.Chrome(options=opts) # 3. 打开页面 driver.get("https://example.com") # 4. 断言 UA actual_ua = driver.execute_script('return navigator.userAgent') assert "CustomAgent" in actual_ua, f"UA 不匹配: {actual_ua}" # 5. 断言窗口尺寸 size = driver.get_window_size() assert size["width"] == 1280 and size["height"] == 720, f"尺寸不匹配: {size}" print("✅ 练习 1 所有断言通过!") driver.quit()
webdriver.Chrome / driver.get() / driver.close() / driver.quit() / driver.current_url
# 快速参考 driver = webdriver.Chrome() driver.get("https://example.com") assert "example.com" in driver.current_url driver.close() # 关闭当前页 driver.quit() # 全部退出
webdriver.Chrome() 启动浏览器,driver.get("https://example.com") 打开页面,断言 current_url 包含 example.comdriver.close() 仅关闭当前标签页,配合 window.open() 多标签场景演示driver.quit() 关闭所有窗口并结束 WebDriver 会话,验证会话结束后再调用 driver API 会抛出异常
操作步骤:
① 使用 webdriver.Chrome() 启动浏览器;
② driver.get("目标URL") 打开页面,断言 driver.current_url 包含预期域名;
③ driver.close() 关闭当前窗口;
④ driver.quit() 结束会话。
# 练习 2 参考答案 from selenium import webdriver import selenium.common.exceptions as se_exc # 启动浏览器 driver = webdriver.Chrome() # ① 打开页面并断言 driver.get("https://example.com") assert "example.com" in driver.current_url print("✅ 页面打开成功:" + driver.current_url) # ② close 关闭当前窗口(多标签场景演示) # 用 JS 打开新标签页 driver.execute_script("window.open('https://autotest-505.pages.dev/','_blank')") # 直接 close 当前标签(默认仍是第一个标签) driver.close() print("✅ driver.close() 执行成功") # ③ quit 关闭全部并结束会话,验证 quit 后再调用会抛异常 driver.quit() print("✅ quit 已执行,验证 quit 后再调用 driver API 会抛异常...") quit_ok = False try: driver.current_url # 会话已结束,应抛异常 except se_exc.NoSuchWindowException: quit_ok = True except se_exc.WebDriverException: quit_ok = True print("✅ 练习 2 完成(quit 后异常已确认)")
maximize_window / minimize_window / fullscreen_window / set_window_size / set_window_position / get_window_size / get_window_position
# 快速参考 driver.maximize_window() driver.set_window_size(800, 600) driver.set_window_position(100, 100) size = driver.get_window_size() assert abs(size["width"] - 800) <= 10
maximize_window() 后断言面板「窗口状态」为 MAX;minimize_window() 后恢复窗口;fullscreen_window() 断言状态为 FULset_window_size(800, 600) 后用 get_window_size() 断言宽度、高度(允许 ±10px 误差)set_window_position(100, 100) 后用 get_window_position() 断言 x、y 坐标(允许 ±10px 误差)
操作步骤:
① 使用 maximize_window() 将窗口最大化,然后断言面板中的「窗口状态」变为 MAX;再用 minimize_window() 最小化,恢复后再调 fullscreen_window() 进入全屏模式(状态应变为 FUL)。
② 使用 set_window_size(800, 600) 设置自定义尺寸,set_window_position(100, 100) 设置位置,再分别用 get_window_size() 和 get_window_position() 断言宽度、高度与 x、y 坐标是否匹配(允许 ±10px 误差)。
# 练习 4 参考答案 import time from selenium.webdriver.common.by import By # 1. 最大化窗口并断言面板状态 driver.maximize_window() time.sleep(1) status = driver.find_element(By.ID, "win_status").text assert status == "MAX", f"期望 MAX,实际 {status}" # 2. 最小化后恢复(演示用,Selenium 会最小化到任务栏) driver.minimize_window() time.sleep(1) # 恢复:使用 set_window_size 重新显示 driver.set_window_size(1000, 700) time.sleep(0.5) # 3. 全屏模式 driver.fullscreen_window() time.sleep(1) # 面板状态需要手动同步(演示页面的 simulateWindow 函数) driver.execute_script("simulateWindow('fullscreen')") status = driver.find_element(By.ID, "win_status").text assert status == "FUL", f"期望 FUL,实际 {status}" # 4. 自定义尺寸 + 位置 driver.set_window_size(800, 600) driver.set_window_position(100, 100) time.sleep(0.5) size = driver.get_window_size() pos = driver.get_window_position() print(f"size={size}, position={pos}") # 允许 ±10px 误差 assert abs(size["width"] - 800) <= 10 assert abs(size["height"] - 600) <= 10 assert abs(pos["x"] - 100) <= 10 assert abs(pos["y"] - 100) <= 10
driver.title / current_url / page_source / session_id / capabilities / name
# 快速参考 driver.get("https://example.com") assert "Example" in driver.title assert "example.com" in driver.current_url assert driver.session_id assert "chrome" == driver.capabilities['browserName'] assert "<html" in driver.page_source.lower()
get() 后断言 driver.title 包含预期文案、driver.current_url 包含目标域名driver.session_id 非空,driver.capabilities['browserName'] 等于 chromedriver.page_source,断言其中包含 <html 标签与页面标题关键字
操作步骤:
① driver.get("目标URL") 后获取 driver.title 断言包含预期文案,driver.current_url 断言包含目标域名。
② 断言 driver.session_id 非空,driver.capabilities['browserName'] 等于 chrome。
③ 获取 driver.page_source 断言包含 <html 标签与页面标题关键字。
💡 driver.page_source 返回完整 HTML 源码,通常包含 <html、<head、<body 等标签。
# 练习 5 参考答案 from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # ① 各种信息获取与断言 title = driver.title assert title is not None and "Example" in title, f"title 不符合预期: {title}" current_url = driver.current_url assert "example.com" in current_url, f"url 不符合预期: {current_url}" session_id = driver.session_id assert session_id, "session_id 为空" browser_name = driver.capabilities['browserName'] assert browser_name == "chrome", f"browserName 不符合预期: {browser_name}" # ② page_source 断言 source = driver.page_source assert "<html" in source.lower(), "page_source 不包含 <html" assert "Example Domain" in source, "page_source 不包含标题文本" driver.quit() print("✅ 练习 5 所有断言通过!")
find_element / click / send_keys / clear / is_displayed / get_attribute / text
# 快速参考 username = driver.find_element(By.ID, "username") username.clear() username.send_keys("test_user") assert username.is_displayed() login_btn = driver.find_element(By.ID, "login_btn") login_btn.click() assert "登录成功" in driver.page_source
find_element(By.ID, "username") 定位输入框,clear() 清空后 send_keys("test_user") 输入内容is_displayed() 断言输入框可见,避免对隐藏元素误操作click() 点击 #login_btn 按钮,断言按钮 disabled 属性变为 true、页面出现「登录成功」文本
操作步骤:
① 用 driver.find_element(By.ID, "username") 找到输入框,clear() 后 send_keys("test_user");
② 用 is_displayed() 断言输入框可见;
③ 点击 #login_btn 按钮;
④ 断言页面中出现预期的提示文本(如"登录成功"或按钮的 disabled 属性变 true)。
# 练习 6 参考答案 from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 请替换为包含上述迷你表单的测试页面 URL driver.get("https://你的测试页面URL") # ① 定位 + 操作前先断言可见 username_input = driver.find_element(By.ID, "username") assert username_input.is_displayed(), "username 输入框不可见" # ② 清空 + 输入 username_input.clear() username_input.send_keys("test_user") # ③ 点击登录按钮 login_btn = driver.find_element(By.ID, "login_btn") login_btn.click() # ④ 断言结果(按钮 disabled 属性变 true 或提示文本) assert login_btn.get_attribute("disabled") == "true", "登录按钮未被禁用" page_text = driver.page_source assert "登录成功" in page_text, "页面未出现「登录成功」" driver.quit() print("✅ 练习 6 所有断言通过!")
add_cookie / get_cookie / get_cookies / delete_cookie / delete_all_cookies
# 快速参考 driver.add_cookie({"name": "role", "value": "admin"}) ck = driver.get_cookie("role") assert ck["value"] == "admin" driver.delete_cookie("role") driver.delete_all_cookies() assert driver.get_cookies() == []
get() 访问目标域,再用 add_cookie() 依次添加 username=tester_01、role=admin、theme=dark,断言面板 Cookie 总数为 3get_cookie("role") 读取单条并断言 value == "admin";get_cookies() 获取全部并遍历打印delete_cookie("theme") 删除单条并验证;delete_all_cookies() 清空全部,最终断言 get_cookies() 返回空列表
操作步骤:
① 使用 driver.add_cookie() 添加至少 3 个 Cookie(如 username=tester_01、role=admin、theme=dark),断言列表面板中出现对应项,且「Cookie 总数」= 3。
② 使用 driver.get_cookie("role") 读取单个 Cookie,断言 value == "admin";再用 get_cookies() 获取全部并遍历打印。
③ 用 delete_cookie("theme") 删除单个,再 delete_all_cookies() 全部清除,最终断言 get_cookies() 返回空列表。
# 练习 7 参考答案 import time from selenium.webdriver.common.by import By # 1. 先刷新一次页面(Cookie 操作前最好先访问该域) driver.get("file:///f:/autotest_project/browser_op_practice.html") # 2. add_cookie 添加 3 个(注意 Selenium add_cookie 的字典格式) driver.add_cookie({"name": "username", "value": "tester_01"}) driver.add_cookie({"name": "role", "value": "admin"}) driver.add_cookie({"name": "theme", "value": "dark"}) # 刷新页面让面板同步显示 Cookie driver.refresh() time.sleep(0.5) total_text = driver.find_element(By.ID, "cookie_total").text print(f"面板显示:{total_text}") assert "3" in total_text # 3. get_cookie 读取单个 ck_role = driver.get_cookie("role") print(f"role cookie = {ck_role}") assert ck_role is not None assert ck_role["value"] == "admin" # 4. get_cookies 遍历全部 all_cks = driver.get_cookies() print(f"共 {len(all_cks)} 个 Cookie:") for c in all_cks: print(f" {c['name']} = {c['value']}") assert len(all_cks) >= 3 # 5. delete_cookie 删除单个 driver.delete_cookie("theme") assert driver.get_cookie("theme") is None # 6. delete_all_cookies 全部清除 driver.delete_all_cookies() assert driver.get_cookies() == []
save_screenshot / get_screenshot_as_base64 / base64.b64decode / os.path.exists / WebElement.screenshot
# 快速参考 import os, base64 ok = driver.save_screenshot("./shot.png") assert ok and os.path.exists("./shot.png") b64 = driver.get_screenshot_as_base64() with open("./shot_b64.png", "wb") as f: f.write(base64.b64decode(b64)) # Selenium 4.0+ 进阶:元素级截图 driver.find_element(By.ID, "shot_target_card").screenshot("./shot_ele.png")
save_screenshot("shot.png") 保存整张页面,断言返回值为 True,用 os.path.exists() 验证文件已生成,os.path.getsize() 断言大小 > 0,扩展名为 .pngget_screenshot_as_base64() 获取 base64 编码,base64.b64decode() 解码后写入 .png 文件#shot_target_card 卡片后调用元素级 .screenshot("./shot_ele.png") 单独截取该元素(Selenium 4.0+ 新增 API)
操作步骤:
① 使用 driver.save_screenshot("shot.png") 保存整张页面截图,断言返回值为 True,用 os.path.exists() 验证文件存在,os.path.getsize() 断言大小 > 0,扩展名为 .png。
② 使用 driver.get_screenshot_as_base64() 获取 base64 编码字符串,用 base64.b64decode() 解码后以二进制写入 shot_b64.png,断言文件已生成且大小 > 0。
③ 进阶:定位页面上的某个元素(如下方的「截图目标卡片」#shot_target_card),使用 element.screenshot("ele.png") 单独截取该元素(Selenium 4.0+ 新增 API)。
截图预览区 — 使用 Selenium save_screenshot() 即可将整张页面保存为 PNG
真实代码示例:driver.save_screenshot("./shots/ex4.png")
# 练习 8 参考答案 import os from selenium.webdriver.common.by import By # 确保已打开页面 if "浏览器操作练习" not in driver.title: driver.get("file:///f:/autotest_project/browser_op_practice.html") # 1. save_screenshot 截图整张页面并验证文件 shot_path = "./shot.png" ok = driver.save_screenshot(shot_path) print(f"save_screenshot 返回值:{ok}") assert ok is True assert os.path.exists(shot_path), f"截图文件不存在: {shot_path}" assert os.path.getsize(shot_path) > 0, "截图文件大小为 0" assert shot_path.endswith(".png"), "截图文件扩展名应为 .png" print(f"截图已保存且验证通过,文件大小:{os.path.getsize(shot_path)} bytes") # 2. get_screenshot_as_base64 获取 base64 并保存为文件 import base64 b64_str = driver.get_screenshot_as_base64() assert len(b64_str) > 0, "base64 字符串为空" b64_path = "./shot_b64.png" with open(b64_path, "wb") as f: f.write(base64.b64decode(b64_str)) assert os.path.exists(b64_path), f"base64 截图文件不存在: {b64_path}" assert os.path.getsize(b64_path) > 0, "base64 截图文件大小为 0" print(f"base64 截图已保存:{b64_path},大小:{os.path.getsize(b64_path)} bytes") # 3. 进阶:Selenium 4.0+ 元素级截图 card = driver.find_element(By.ID, "shot_target_card") card.screenshot("./shot_ele.png") assert os.path.exists("./shot_ele.png") and os.path.getsize("./shot_ele.png") > 0 print("✅ 元素级截图成功:shot_ele.png") print("✅ 练习 8 所有断言通过!")
implicitly_wait / set_page_load_timeout / WebDriverWait.until / expected_conditions
# 快速参考 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver.set_page_load_timeout(15) element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "target")) )
driver.implicitly_wait(10) 全局设置,验证 find_element 在元素延迟出现时会自动等待最多 10 秒set_page_load_timeout(15) 限制 get() 整体加载时长,超时抛出 TimeoutExceptionWebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) 等待异步元素出现;拓展使用 element_to_be_clickable 等待按钮可点击
操作步骤:
① 启动后立即设置 driver.implicitly_wait(10) 隐式等待;
② 设置 driver.set_page_load_timeout(15) 页面加载超时;
③ 打开本练习页,用 driver.execute_script() 触发异步加载,再用 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "async_target"))) 显式等待;
④ 验证超时行为(可选)。
#async_target)
⚠️ 隐式等待和显式等待不要混用,可能导致不可预期的等待时长。
# 练习 9 参考答案 import os 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.implicitly_wait(10) # ② 页面加载超时 driver.set_page_load_timeout(15) # ③ 打开本练习页面(async_target 元素在这个页面里) # 把下面路径换成你本机 browser_op_practice.html 的绝对路径 practice_html = "file:///" + os.path.abspath("./browser_op_practice.html").replace("\\", "/") driver.get(practice_html) # ④ 用 JS 触发异步加载(3 秒后才把 #async_target 插入 DOM) driver.execute_script(""" setTimeout(function(){ var d = document.createElement('div'); d.id = 'async_target'; d.textContent = '异步元素已加载'; d.style.cssText = 'padding:12px;background:#8b5cf6;color:white;border-radius:8px;font-weight:600;'; document.body.appendChild(d); }, 3000); """) # ⑤ 显式等待:等待 #async_target 出现(WebDriverWait 推荐方式) try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "async_target")) ) print("✅ 显式等待成功:#async_target 已出现") except Exception as e: print("❌ 显式等待超时:" + str(e)) # (可选)等待元素可见 + 可点击 try: visible_el = WebDriverWait(driver, 5).until( EC.visibility_of_element_located((By.ID, "async_target")) ) assert visible_el.is_displayed(), "元素不可见" print("✅ visibility_of_element_located 通过") except Exception as e: print("❌ 可见性等待超时:" + str(e)) driver.quit() print("✅ 练习 9 所有断言通过!")