悠悠楠杉
Python自动化测试实战:Selenium框架从入门到精通
一、为什么选择Selenium?
作为从业10年的测试工程师,我见证过太多团队从手工测试到自动化测试的转型。Selenium之所以能成为行业标准,核心在于它的跨平台、多语言支持和开源生态。最新统计显示,全球76%的Web自动化测试项目采用Selenium方案。
二、环境搭建(含避坑指南)
2.1 基础环境配置
python
推荐使用conda创建独立环境
conda create -n auto_test python=3.8
pip install selenium==4.1.0 webdriver-manager
2.2 浏览器驱动管理
传统方式需要手动下载驱动,现在推荐使用:python
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
常见报错解决:若出现ERR_SSL_PROTOCOL_ERROR
,添加--ignore-certificate-errors
参数即可。
三、八大元素定位实战
以百度搜索为例,演示不同定位策略:
python
CSS选择器(推荐)
searchbox = driver.findelement(By.CSS_SELECTOR, "#kw")
XPath高级用法
searchbutton = driver.findelement(
By.XPATH, "//input[@id='su' and contains(@class, 'btn')]"
)
相对定位(Selenium 4新增)
relativeloc = driver.findelement(
By.XPATH, "//form[@name='f']/following-sibling::script"
)
定位优先级建议:
1. 首选CSS Selector(性能最优)
2. 复杂结构用XPath
3. 动态ID考虑部分匹配
四、等待机制深度优化
4.1 智能等待封装
python
def wait_clickable(locator, timeout=10):
return WebDriverWait(driver, timeout).until(
EC.element_to_be_clickable(locator)
)
4.2 自定义等待条件
python
class elementhascssclass(object):
def init(self, locator, cssclass):
self.locator = locator
self.cssclass = cssclass
def __call__(self, driver):
element = driver.find_element(*self.locator)
if self.css_class in element.get_attribute("class"):
return element
return False
五、Pytest集成实战
5.1 基础测试架构
python
conftest.py
@pytest.fixture(scope="module")
def browser():
driver = init_driver()
yield driver
driver.quit()
test_search.py
def testbaidusearch(browser):
browser.get("https://www.baidu.com")
assert "百度" in browser.title
5.2 高级功能整合
python
失败自动截图
@pytest.hookimpl(hookwrapper=True)
def pytestruntestmakereport(item, call):
outcome = yield
report = outcome.getresult()
if report.when == "call" and report.failed:
browser = item.funcargs["browser"]
browser.savescreenshot(f"error_{item.name}.png")
六、企业级框架设计
6.1 Page Object模式进阶
python
class LoginPage:
def init(self, driver):
self.driver = driver
self.url = config.BASE_URL + "/login"
@property
def username(self):
return self.driver.find_element(By.ID, "username")
def login(self, user, pwd):
self.username.send_keys(user)
# 其他操作...
return HomePage(self.driver)
6.2 自动化测试平台集成
python
对接Jenkins示例
import jenkins
server = jenkins.Jenkins(
'http://jenkins:8080',
username='admin',
password='******'
)
server.buildjob('autotest_suite')
七、性能优化技巧
- 并行执行:使用pytest-xdist插件
bash pytest -n 4 tests/
- 无头模式加速:
python options = webdriver.ChromeOptions() options.add_argument("--headless")
- 网络请求Mock:配合requests_mock减少依赖
八、新时代挑战与对策
随着SPA应用的普及,传统定位方式面临挑战。建议:
- 使用
driver.execute_script()
处理Shadow DOM - 对动态元素采用指纹定位(如文本+元素类型组合)
- 引入AI视觉定位(Applitools等工具)
结语:自动化测试不是目的而是手段,真正的价值在于建立快速反馈的质保体系。建议从关键路径开始,逐步扩大覆盖范围。记住,好的自动化case应该像钟表齿轮一样精准协作。