如何使用Selenium对集成Okta的应用执行UI性能及可用性检测
集成Okta认证的Selenium UI自动化测试方案
前置Okta配置
首先需要在Okta后台完成测试账号的配置,避免走推送验证流程:
- 申请独立的测试专用账号,不要和日常使用的账号复用,避免权限泄露风险
- 可选方案1:为该测试账号配置IP白名单,直接豁免MFA验证,是最省事的方案
- 可选方案2:如果公司安全规范不允许免MFA,就给测试账号绑定TOTP验证器,保存好TOTP生成的静态密钥,后续可以直接用Python代码生成动态验证码,完全不需要依赖推送通知
代码改造步骤
你需要额外安装两个依赖:pyotp(用来生成TOTP验证码)、webdriver-manager(可选,自动管理chromedriver版本,避免版本不匹配问题),安装命令:pip install pyotp webdriver-manager
改造后的完整示例代码如下,替换对应配置项即可使用:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pyotp from webdriver_manager.chrome import ChromeDriverManager # -------------------------- 替换为你自己的配置 -------------------------- APP_URL = "你要测试的应用地址" OKTA_USERNAME = "测试账号用户名" OKTA_PASSWORD = "测试账号密码" # 如果用免MFA方案,下面这行留空即可 TOTP_SECRET = "你在Okta绑定TOTP时拿到的静态密钥" # ---------------------------------------------------------------------- # 配置Chrome无头模式,适配无图形界面的定时任务运行环境 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920,1080") # 初始化driver,用webdriver_manager自动管理chromedriver版本 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) driver.implicitly_wait(10) try: # 打开目标应用,会自动跳转到Okta登录页 driver.get(APP_URL) # 等待Okta用户名输入框加载完成,输入用户名 username_input = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.NAME, "username")) ) username_input.send_keys(OKTA_USERNAME) username_input.send_keys(Keys.RETURN) # 输入密码 password_input = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.NAME, "password")) ) password_input.send_keys(OKTA_PASSWORD) password_input.send_keys(Keys.RETURN) # 如果配置了TOTP密钥,就生成验证码输入 if TOTP_SECRET: totp = pyotp.TOTP(TOTP_SECRET) totp_code = totp.now() totp_input = WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.NAME, "answer")) ) totp_input.send_keys(totp_code) totp_input.send_keys(Keys.RETURN) # 等待跳转回你的应用,确认登录成功 WebDriverWait(driver, 15).until( EC.url_contains(APP_URL.split("//")[1].split("/")[0]) ) # -------------------------- 下面写你自己的测试逻辑 -------------------------- # 示例:打印页面标题、当前URL print("登录成功,页面标题:", driver.title) print("当前页面地址:", driver.current_url) # 示例:性能数据采集 perf_data = driver.execute_script("return performance.timing") load_time = (perf_data['loadEventEnd'] - perf_data['navigationStart'])/1000 print(f"页面总加载耗时:{load_time}秒") # 示例:检查页面是否有异常关键词 page_source = driver.page_source if "502 Bad Gateway" in page_source or "403 Forbidden" in page_source: print("检测到网关异常!") # 可以在这里加告警逻辑,比如发邮件、发企业微信消息 # 异常场景截图:driver.save_screenshot("/opt/uitest/error.png") finally: # 确保不管测试是否成功,都关闭driver释放资源 driver.quit()
如果你的Okta登录页的元素选择器和示例不一致,可以用浏览器F12开发者工具自行定位对应的输入框元素,替换代码里的By.NAME参数即可
cron定时任务配置注意事项
- 写crontab的时候建议指定完整的Python解释器路径和脚本路径,避免找不到依赖
- 可以配置任务运行日志输出,示例:
0 * * * * /usr/bin/python3 /opt/uitest/test.py >> /var/log/okta_ui_test.log 2>&1,方便排查任务运行异常 - 建议每次运行前检查是否有残留的chromedriver或Chrome进程,避免内存泄露,可以在脚本开头加清理逻辑,或者用tmpfs挂载临时目录减少资源占用
内容的提问来源于stack exchange,提问作者Vinita Shah
相关产品推荐
相关产品推荐

