如何让Python编写的Web应用自动化脚本适配4种用户角色运行?
适配多用户角色的Web自动化脚本实现方案
作为Python新手,你可以通过拆分角色逻辑、配置映射、动态选择执行这几个核心步骤来实现多角色适配,下面是具体的落地方法:
1. 拆分通用与角色专属逻辑
先把脚本里的通用操作(比如登录、打开/关闭浏览器)抽成基础类,再为每个角色单独编写专属任务的子类,既复用代码,又能清晰区分不同角色的操作。
示例代码:
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException # 基础自动化类:封装所有角色通用的操作 class BaseAutomation: def __init__(self, driver): self.driver = driver self.base_url = "https://你的Web应用地址.com" def open_app(self): self.driver.get(self.base_url) def login(self, username, password): # 通用登录流程,根据你的Web页面元素调整 self.driver.find_element("id", "username-input").send_keys(username) self.driver.find_element("id", "password-input").send_keys(password) self.driver.find_element("id", "login-submit").click() def close_app(self): self.driver.quit() # 角色A专属操作类:提交采购申请 class RoleA(BaseAutomation): def run_task(self): try: self.driver.find_element("id", "purchase-apply-btn").click() self.driver.find_element("id", "product-name").send_keys("办公电脑") self.driver.find_element("id", "submit-apply").click() print("角色A任务执行完成") except NoSuchElementException as e: print(f"角色A任务出错:找不到元素 {e}") # 角色B专属操作类:审核采购申请 class RoleB(BaseAutomation): def run_task(self): try: self.driver.find_element("id", "audit-list").click() self.driver.find_element("id", "approve-first-item").click() print("角色B任务执行完成") except NoSuchElementException as e: print(f"角色B任务出错:找不到元素 {e}") # 角色C专属操作类:查看采购报表 class RoleC(BaseAutomation): def run_task(self): try: self.driver.find_element("id", "report-menu").click() self.driver.find_element("id", "export-report").click() print("角色C任务执行完成") except NoSuchElementException as e: print(f"角色C任务出错:找不到元素 {e}") # 角色D专属操作类:修改系统配置 class RoleD(BaseAutomation): def run_task(self): try: self.driver.find_element("id", "settings-menu").click() self.driver.find_element("id", "update-timeout").send_keys("30") self.driver.find_element("id", "save-settings").click() print("角色D任务执行完成") except NoSuchElementException as e: print(f"角色D任务出错:找不到元素 {e}")
2. 配置角色信息映射
用字典把角色名称、账号密码、对应的操作类关联起来,避免硬编码,后续修改角色信息更方便。
示例:
# 角色配置字典:key是角色标识,value是(用户名, 密码, 对应操作类) ROLE_SETTINGS = { "role_a": ("user_a", "pass_a123", RoleA), "role_b": ("user_b", "pass_b456", RoleB), "role_c": ("user_c", "pass_c789", RoleC), "role_d": ("user_d", "pass_d012", RoleD) }
3. 添加角色选择与执行入口
给脚本加一个入口,支持命令行传参或交互式选择两种方式:
方式1:命令行传参启动
适合批量执行或脚本集成场景:
import sys def main(): # 检查命令行参数 if len(sys.argv) != 2: print("使用方法:python your_script.py <角色名称>") print("可选角色:role_a, role_b, role_c, role_d") sys.exit(1) selected_role = sys.argv[1] if selected_role not in ROLE_SETTINGS: print(f"无效角色,请选择:{', '.join(ROLE_SETTINGS.keys())}") sys.exit(1) # 初始化浏览器驱动(这里用Chrome,可替换为Firefox等) driver = webdriver.Chrome() # 获取角色配置 username, password, RoleClass = ROLE_SETTINGS[selected_role] # 实例化角色操作对象 automation = RoleClass(driver) # 执行完整流程 automation.open_app() automation.login(username, password) automation.run_task() automation.close_app() if __name__ == "__main__": main()
方式2:交互式选择启动
适合手动运行脚本的场景:
def main(): print("=== 选择要执行的用户角色 ===") # 列出所有角色选项 for idx, role_name in enumerate(ROLE_SETTINGS.keys(), 1): print(f"{idx}. {role_name}") # 获取用户选择 try: choice = int(input("请输入对应编号:")) role_name = list(ROLE_SETTINGS.keys())[choice - 1] except (ValueError, IndexError): print("输入无效,请重新运行脚本选择正确编号") return # 后续执行逻辑和命令行方式一致 driver = webdriver.Chrome() username, password, RoleClass = ROLE_SETTINGS[role_name] automation = RoleClass(driver) automation.open_app() automation.login(username, password) automation.run_task() automation.close_app() if __name__ == "__main__": main()
4. 可选优化:添加超时等待与容错
如果想让脚本更健壮,可以用WebDriverWait添加元素加载超时等待,避免页面加载慢导致的报错:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class RoleA(BaseAutomation): def run_task(self): try: # 等待按钮加载完成再点击,超时10秒 apply_btn = WebDriverWait(self.driver, 10).until( EC.presence_of_element_located(("id", "purchase-apply-btn")) ) apply_btn.click() # 其他操作... print("角色A任务执行完成") except Exception as e: print(f"角色A任务出错:{str(e)}")
内容的提问来源于stack exchange,提问作者Ranit Mondal
相关产品推荐
相关产品推荐

