Selenium 和 Playwright 对照代码版

0 阅读4分钟

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 常见核心对象是 browsercontextpage

二、定位元素

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,都会轻松很多。