本项目基于Selenium相关习题-CSDN博客修改一、项目目录结构简历级创建以下文件selenium_web_automation_framework/ ├── pages/ # 页面对象层 │ ├── __init__.py │ ├── base_page.py # 基类封装通用操作 │ ├── bilibili_page.py # B站首页对象 │ └── login_page.py # 登录练习站对象 ├── testcases/ # 测试用例层 │ ├── __init__.py │ ├── test_bilibili_search.py # B站搜索用例 │ └── test_login.py # 登录用例数据驱动 ├── data/ # 测试数据 │ └── login_data.xlsx # 登录测试数据Excel ├── conftest.py # driver fixture ├── requirements.txt # 依赖库 ├── run_tests.py # 一键运行入口 └── README.md # 项目说明面试加分项如图所示二、具体代码和数据1testdata_pytest.xlsx—— Excel 数据样例2base_page.py—— 封装等待、查找等通用操作from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class BasePage: def __init__(self, driver): self.driver driver self.wait WebDriverWait(driver, 10) def find_element(self, locator): 等待元素存在并返回 return self.wait.until(EC.presence_of_element_located(locator)) def click_element(self, locator): 等待元素可点击后点击 self.wait.until(EC.element_to_be_clickable(locator)).click() def input_text(self, locator, text): 等待元素可交互后输入 element self.wait.until(EC.element_to_be_clickable(locator)) element.clear() element.send_keys(text) def get_text(self, locator): 获取元素文本 return self.find_element(locator).text def switch_to_new_window(self): 切换到最新打开的标签页 handles self.driver.window_handles self.driver.switch_to.window(handles[-1])3)bilibili_page.py—— B站首页搜索from selenium.webdriver.common.by import By from pages.base_page import BasePage class BilibiliPage(BasePage): URL https://www.bilibili.com/ # 定位器集中管理页面变化只改这里 SEARCH_INPUT (By.XPATH, //*[idnav-searchform]/div[1]/input) SEARCH_BUTTON (By.XPATH, //*[idnav-searchform]/div[2]) def open(self): self.driver.get(self.URL) def search(self, keyword): self.input_text(self.SEARCH_INPUT, keyword) self.click_element(self.SEARCH_BUTTON) # 搜索后B站会打开新标签页自动切换过去 self.switch_to_new_window() def get_page_title(self): return self.driver.title4)login_page.py—— 练习登录站from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException from pages.base_page import BasePage class LoginPage(BasePage): URL https://practicetestautomation.com/practice-test-login/ # 定位器 USERNAME_INPUT (By.ID, username) PASSWORD_INPUT (By.ID, password) SUBMIT_BUTTON (By.ID, submit) LOGOUT_BUTTON (By.XPATH, //*[idloop-container]/div/article/div[2]/div/div/div/a) ERROR_MESSAGE (By.ID, error) # 如果有错误提示 def open(self): self.driver.get(self.URL) def enter_username(self, username): self.input_text(self.USERNAME_INPUT, username) def enter_password(self, password): self.input_text(self.PASSWORD_INPUT, password) def click_login(self): self.click_element(self.SUBMIT_BUTTON) def login(self, username, password): 完整登录操作 self.enter_username(username) self.enter_password(password) self.click_login() def is_logout_displayed(self): 判断登录是否成功返回True/False try: self.get_text(self.LOGOUT_BUTTON) return True except TimeoutException: return False def get_logout_text(self): return self.get_text(self.LOGOUT_BUTTON)5)test_bilibili_search.py—— B站搜索用例import pytest from pages.bilibili_page import BilibiliPage from conftest import driver class TestBilibiliSearch: def test_search_earth(self, driver): 测试搜索地球结果页标题应包含关键词 # assert True bilibili_page BilibiliPage(driver) bilibili_page.open() bilibili_page.search(地球) assert 地球 in bilibili_page.get_page_title() # print(aaa)6)test_login.py—— 登录数据驱动import pytest import openpyxl from pages.login_page import LoginPage from conftest import driver def get_login_data(): 从Excel读取测试数据返回 (username, password, expected_result) workbook openpyxl.load_workbook(C:/study/python/selenium_web_automation_framework/data/testdata_pytest.xlsx) sheet workbook.active data [] for row in sheet.iter_rows(min_row2, values_onlyTrue): data.append(row) return data class TestLogin: pytest.mark.parametrize(username,password,expected, get_login_data()) def test_login(self, driver, username, password, expected): login_page LoginPage(driver) login_page.open() login_page.login(username, password) if expected 登录成功: assert login_page.is_logout_displayed(), 应该显示Log out按钮 else: assert not login_page.is_logout_displayed(), 不应该登录成功7)conftest.py —— 全局 driver fixturefrom selenium import webdriver from selenium.webdriver.chrome.service import Service import pytest pytest.fixture def driver(): # 根据你的ChromeDriver路径修改 d webdriver.Chrome(serviceService(C:/study/python/selenium_web_automation_framework/chromedriver.exe)) d.maximize_window() yield d # 这个d会传给测试函数 d.quit() # 测试结束后自动执行8)run_tests.py —— 一键运行并生成报告为 Allure 预留import pytest import os if __name__ __main__: # 运行所有用例生成Allure报告数据 pytest.main([ -v, --alluredir./reports/allure-results, ./testcases/ ]) # 自动打开报告确保已安装allure os.system(allure serve ./reports/allure-results)9)requirements.txt安装命令pip install -r requirements.txtselenium4.0 pytest7.0 openpyxl3.0三、运行结果1提前安装allure并配置环境变量如图所示2在pycharm命令行cd到python_run_tests.py所在目录下运行python run_tests.py如图所示3运行结果如图所示