Python+Selenium Web UI自动化测试核心是驱动可控、定位精准:需匹配WebDriver版本并用webdriver-manager自动管理,优先采用data-testid等语义化定位策略,配合显式等待和业务级断言确保稳定性与有效性。
用 Python 调 Selenium 不是写脚本,而是模拟真实用户行为:启动浏览器、跳转页面、点按钮、填表单、断言结果。成败关键不在代码多华丽,而在 WebDriver 是否稳定启动,以及元素能不能每次都被准确定位到。
ChromeDriver 或 GeckoDriver 必须和本地浏览器版本匹配,否则常见报错如 session not created 或 unknown error: cannot find Chrome binary。推荐用 webdriver-manager 自动管理驱动版本:
pip install webdriver-manager
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
ID 最快最稳,但现代前端常动态生成;纯 XPath 容易因 DOM 微调而断裂。建议按优先级组合使用:
/html/body/div[2]/form/input[1] —— 页面结构一改就失效//button[contains(text(), '提交') and @type='submit']
元素没加载完就点击?JS 还没执行完就断言?这是脚本失败主因。Selenium 提供两类等待:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()='提交']")))
find_element 类方法,无法应对“元素存在但不可点”的场景别只写 assert "登录成功" in driver.title。真实验证应贴近用户视角:
assert welcome_el.is_displayed()
error_msg = driver.find_element(By.CLASS_NAME, "error").text,再 assert 是否含关键词driver.save_screenshot("fail_login.png"),尤其在 CI 失败时非常有用写好一个用例不难,难的是所有用例能持续跑通。重点不在功能多全,而在驱动稳、定位准、等待对、断言真。把这四件事理清楚,UI 自动化才真正落地为质量保障环节
。