控制窗口大小与位置
演示浏览器窗口的 位置、尺寸、显示状态 全维度控制。Selenium 4 新增的 set_window_rect() 将 size + position 两步操作合并为一个原子方法,是窗口控制的首选 API。
核心 API 对比:
maximize_window() → 拉满屏幕(含地址栏标签栏),不是全屏minimize_window() → 缩到任务栏,Chrome 才支持fullscreen_window() → F11 全屏,地址栏标签栏都隐藏set_window_size(w,h) / set_window_position(x,y) → Selenium 3 风格,两次调用会有 闪烁set_window_rect(x,y,w,h) → Selenium 4 原子操作,一次调用改位置+尺寸,无闪烁💡 进阶技巧:可以先用 get_window_rect() 存快照,跑测试,结束后用 set_window_rect(**saved) 一键恢复(Python dict 解包)。
maximize 和 fullscreen 不一样:前者保留任务栏,后者 F11 沉浸式 |
set_window_rect 是 Selenium 4 新增,一次搞定尺寸+位置
driver.maximize_window() 最大化窗口driver.minimize_window() 最小化窗口driver.fullscreen_window() 全屏(F11)driver.set_window_size(w, h) 设置尺寸driver.set_window_position(x, y) 设置位置driver.set_window_rect(x, y, width, height) 同时设置尺寸和位置driver.get_window_size() 获取尺寸,返回 {'width':w, 'height':h}driver.get_window_position() 获取左上角坐标
Selenium 自动化测试练习平台
# ① 启动浏览器并打开窗口控制演示页 from selenium import webdriver driver = webdriver.Chrome() driver.get("https://autotest-505.pages.dev/browser_op_tech_sections/window_control_tech.html") # ② 设置 / 获取窗口尺寸(单位:像素) driver.set_window_size(1024, 768) print(driver.get_window_size()) # {'width': 1024, 'height': 768} # ③ 设置 / 获取窗口位置(相对屏幕左上角) driver.set_window_position(100, 50) print(driver.get_window_position()) # {'x': 100, 'y': 50} # ④ 一次设置 x / y / width / height driver.set_window_rect(x=0, y=0, width=1280, height=800) # ⑤ 最大化 / 最小化 / 全屏(等同 F11) driver.maximize_window() driver.minimize_window() driver.fullscreen_window() # ⑥ 结束会话 driver.quit()
| 因素 | 本地 | CI/CD 云服务器 |
| 网络 | 专线稳定 | 数据中心共享,偶发抖动 |
| CPU | 独占 | 多租户,可能被抢占 |
| 浏览器缓存 | 有 | 没有(每次全新启动) |
| 页面加载速度 | 有缓存,秒出 | 全量下载,慢 2~5 倍 |
| 并发任务 | 只跑你这一份 | 可能几十上百个同时抢资源 |
"A session has an associated session implicit wait timeout that specifies a time to wait for the implicit element location strategy"implicit=0.5s → 驱动最多等待 500ms 后必须放弃
→ 驱动在一次 findElement / findElements 调用中,最多愿意等待的总时间即为该值,不得超时。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def test_polling(d, delay):
d.implicitly_wait(2)
d.get('about:blank')
d.execute_script(f"setTimeout(()=>{{document.body.innerHTML='t'}},{delay})")
t0 = time.perf_counter()
try:
cost = (time.perf_counter() - t0) * 1000
print(f"delay={delay:4d} 耗时={cost:6.0f} 差值={cost-delay:+5.0f}")
except: print(f"delay={delay} 超时")
driver = webdriver.Chrome()
for delay in range(10, 1550, 50): # 50ms 步进,覆盖 10~1500ms
test_polling(driver, delay)
driver.quit()
最坏 = implicit × (explicit超时 / pollFreq)try: find_element ... except NoSuchElementException:| 值 | 兜底窗口 (规范定义) |
叠加成本 explicit=15s |
白等 10次不存在 |
依据类型 | 推荐 |
| 不设(=0) | 0ms | 0 秒 | 0 秒 | 规范 | 最严谨 |
| 1s | 1000ms | 30 秒 | 10 秒 | 经验+权衡 | 默认推荐 |
| 0.5s | 500ms | 15 秒 | 5 秒 | 经验+权衡 | 确认页面 <500ms |
| 2s | 2000ms | 60 秒 | 20 秒 | 代价太大 | 谨慎 |
| ≥5s | ≥5000ms | 150 秒+ | 50 秒+ | 爆炸 | ❌ 绝对避免 |