Selenium 和 Playwright 对照代码版
学习 UI 自动化时,很多同学都会遇到一个问题:
我知道 Selenium,也知道 Playwright,但总感觉两个工具是分开记的。一旦真正写代码,就很难快速建立“这两个工具在同一个场景下分别怎么写”的对应关系。
所以这篇文章专门做一件事:
把 Selenium 和 Playwright 放在同一个场景里,做代码对照。
这样你在学习、面试、选型、迁移项目时,会更容易建立整体理解。
一、打开浏览器并访问页面
Selenium
from selenium import webdriver
driver = webdriver.Chrome() # 启动 Chrome 浏览器
driver.get("https://example.com") # 打开目标页面
print(driver.title) # 打印当前页面标题
driver.quit() # 关闭整个浏览器会话
Playwright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动 Chromium 浏览器
page = browser.new_page() # 新建一个页面标签
page.goto("https://example.com") # 打开目标页面
print(page.title()) # 打印当前页面标题
browser.close() # 关闭浏览器
对照理解
- Selenium 的核心对象是
driver - Playwright 常见核心对象是
browser、context、page
二、定位元素
Selenium
from selenium.webdriver.common.by import By
driver.find_element(By.ID, "username") # 按 id 定位输入框
driver.find_element(By.CSS_SELECTOR, "button.submit") # 按 CSS 定位按钮
driver.find_element(By.XPATH, "//button[@type='submit']") # 按 XPath 定位按钮
Playwright
page.locator("#username") # 按 id 选择元素
page.locator("button.submit") # 按 CSS 选择元素
page.locator("//button[@type='submit']") # 按 XPath 选择元素
对照理解
- Selenium 用
find_element - Playwright 更推荐
locator
三、输入和点击
Selenium
driver.find_element(By.ID, "username").send_keys("admin") # 输入用户名
driver.find_element(By.ID, "password").send_keys("123456") # 输入密码
driver.find_element(By.ID, "login-btn").click() # 点击登录按钮
Playwright
page.locator("#username").fill("admin") # 输入用户名
page.locator("#password").fill("123456") # 输入密码
page.locator("#login-btn").click() # 点击登录按钮
对照理解
- Selenium 输入常用
send_keys - Playwright 输入常用
fill
四、获取文本
Selenium
text = driver.find_element(By.CLASS_NAME, "msg").text # 获取提示文本
print(text) # 打印提示文本
Playwright
text = page.locator(".msg").text_content() # 获取提示文本
print(text) # 打印提示文本
五、等待元素出现
Selenium
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) # 最多等待 10 秒
element = wait.until(
EC.visibility_of_element_located((By.ID, "username")) # 等到输入框可见
)
Playwright
page.locator("#username").wait_for() # 等待输入框出现或可交互
或者:
page.wait_for_url("**/dashboard") # 等待页面 URL 跳转到 dashboard
对照理解
- Selenium 更常显式写等待条件
- Playwright 自带较强自动等待,但复杂场景仍可显式等待
六、断言
Selenium
assert "登录成功" in driver.page_source # 断言页面源码中包含成功提示
assert driver.current_url == "https://example.com/dashboard" # 断言当前地址正确
Playwright
from playwright.sync_api import expect
expect(page).to_have_url("https://example.com/dashboard") # 断言页面 URL
expect(page.locator(".msg")).to_have_text("登录成功") # 断言提示文案
七、iframe 处理
Selenium
driver.switch_to.frame("frame1") # 切换到 iframe
driver.find_element(By.ID, "username").send_keys("admin") # 在 iframe 内输入
driver.switch_to.default_content() # 切回主文档
Playwright
frame = page.frame_locator("#frame1") # 获取 iframe 定位器
frame.locator("#username").fill("admin") # 在 iframe 内输入内容
八、弹窗处理
Selenium
alert = driver.switch_to.alert # 获取浏览器原生弹窗对象
print(alert.text) # 打印弹窗文本
alert.accept() # 点击确定
Playwright
page.on("dialog", lambda dialog: dialog.accept()) # 监听弹窗并自动点击确定
九、多窗口处理
Selenium
main = driver.current_window_handle # 记录主窗口句柄
driver.find_element(By.ID, "open").click() # 点击打开新窗口
driver.switch_to.window(driver.window_handles[-1]) # 切换到最新窗口
driver.close() # 关闭当前新窗口
driver.switch_to.window(main) # 切回主窗口
Playwright
with page.expect_popup() as popup_info:
page.locator("#open").click() # 点击后等待新窗口弹出
new_page = popup_info.value # 拿到新页面对象
new_page.wait_for_load_state() # 等待新页面加载完成
十、文件上传
Selenium
driver.find_element(By.ID, "upload").send_keys("/path/to/file.txt") # 直接上传本地文件
Playwright
page.set_input_files("#upload", "/path/to/file.txt") # 给上传控件设置文件
十一、截图
Selenium
driver.save_screenshot("failed.png") # 对当前页面截图
Playwright
page.screenshot(path="failed.png") # 对当前页面截图
十二、网络拦截和 Mock
Selenium
Selenium 本身对网络拦截支持不如 Playwright 直接,很多时候需要借助额外工具或浏览器能力。
Playwright
page.route("**/api/login", lambda route: route.fulfill(
status=200, # 模拟返回成功状态码
body='{"code":0,"msg":"success"}' # 模拟返回响应体
))
十三、一个完整登录流程对照
Selenium
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.get("https://example.com/login") # 打开登录页
driver.find_element(By.ID, "username").send_keys("admin") # 输入用户名
driver.find_element(By.ID, "password").send_keys("123456") # 输入密码
driver.find_element(By.ID, "login-btn").click() # 点击登录
WebDriverWait(driver, 10).until(
EC.url_contains("dashboard") # 等待跳转到 dashboard
)
assert "dashboard" in driver.current_url # 断言登录成功
driver.quit() # 关闭浏览器
Playwright
from playwright.sync_api import sync_playwright, expect
with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动浏览器
page = browser.new_page() # 新建页面
page.goto("https://example.com/login") # 打开登录页
page.locator("#username").fill("admin") # 输入用户名
page.locator("#password").fill("123456") # 输入密码
page.locator("#login-btn").click() # 点击登录
expect(page).to_have_url("https://example.com/dashboard") # 断言跳转成功
browser.close() # 关闭浏览器
十四、写在最后
对照代码的意义,不是让你死记 API,而是帮你建立“同一个测试场景,不同工具是怎么表达的”这种映射关系。
如果你能把这篇文章里的代码场景基本对应起来,后面无论你是做工具选型、写博客、准备面试,还是把老项目从 Selenium 逐步迁到 Playwright,都会轻松很多。