# psa **Repository Path**: KaroZeng/psa ## Basic Information - **Project Name**: psa - **Description**: pytest selenium allure - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-27 - **Last Updated**: 2024-11-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PSA-Docker #### 介绍 pytest selenium allure #### 软件架构 软件架构说明 使用kasmweb开源镜像提供在docker中运行Web自动化测试 PSA(Pytest+Selenium+Allure) ``` selenium==3.141.0 urllib3 == 1.26.2 allure-pytest == 2.13.5 pytest-html == 4.1.1 redis == 5.0.4 pyscreeze==0.1.28 pyautogui == 0.9.52 pymysql == 1.1.1 dbutils == 1.3 ddddocr == 1.5.3 pytesseract ``` #### 安装教程 1. 封装用于Web自动化的镜像 ```shell sudo docker-compose up -d ``` 2. 拷贝项目到容器中 ```shell sudo docker cp ./psademo/ [容器id]:/app/ ``` 3. 运行自动化测试 ```shell python3 main.py ``` #### PSA框架使用 ##### 前置-配置浏览器案例 ```python # 通过配置参数设置浏览器配置 @pytest.mark.parametrize( "browser_driver",[{ 'browser_type':'chrome', 'headless':False, 'url': 'http://192.168.21.2:8080', }],indirect=True ) def test_case1_with_open_browser(self, browser_driver): bp = BasePage(browser_driver) logger.info("测试用例执行 browser driver:{}".format(type(browser_driver))) bp.sleep(10) # conftest.py class DefaultConfig(object): browser_type = "chrome" headless = False url = "https://www.baidu.com/" # 配置默认参数后不传参启动Chrome浏览器 @pytest.mark.parametrize( "browser_driver",[{}],indirect=True) def test_case1_with_open_browser(self, browser_driver): bp = BasePage(browser_driver) logger.info("测试用例执行 browser driver:{}".format(type(browser_driver))) bp.sleep(10) ``` ##### 前置-登录案例 ```python # 继承BasePage创建LoginPage import allure from selenium.webdriver.common.by import By from psa.BasePage import BasePage class LoginPage(BasePage): @allure.step("禅道账号登录") def login_success(self, username, password): self.input_text((By.XPATH, "//input[@name='account']"), username, name="输入账号") self.input_text((By.XPATH, "//input[@name='password']"), password, name="输入密码") self.click_element((By.XPATH, "//button[@id='submit']"), name="点击登录按钮") self.wait_element((By.XPATH, "//*[contains(text(),'地盘')] "), timeout=10, name="等待页面显示地盘") self.sleep(3) # 前置引用LoginPage @pytest.fixture(scope="function") def login_zentao(browser_driver,request): params = request.param username = params['username'] password = params['password'] login_page = LoginPage(browser_driver) login_page.login_success(username, password) return browser_driver # 引用前置并传参 @pytest.mark.parametrize( "browser_driver",[{}],indirect=True ) @pytest.mark.parametrize( "login_zentao", [ { 'username': 'karo', 'password': 'Karo@2024' }],indirect=True) def test_zentao_login(self,browser_driver,login_zentao): bp = BasePage(browser_driver) ``` ##### 传参-用例传参配置 ```python # 编写从文件读取数据工具类. 支持json,csv,excel import os import pandas as pd from settings import TESTDATA_DIR from psa.log import logger class FileData: @staticmethod def get_from_json(json_name, keys): file_path = os.path.join(TESTDATA_DIR, "json", json_name) # logger.info("Get Data From {}".format(file_path)) df = pd.read_json(file_path) data = df.loc[:, keys].values.tolist() return data @staticmethod def get_from_excel(excel_name, case_name, keys): file_path = os.path.join(TESTDATA_DIR, "excel", excel_name) logger.info("Get Data From {}".format(file_path)) df = pd.read_excel(file_path) df = df.loc[df['case_name'] == case_name] data = df.loc[:, keys].values.tolist() return data @staticmethod def get_from_csv(csv_name, keys): file_path = os.path.join(TESTDATA_DIR, "csv", csv_name) logger.info("Get Data From {}. keys:{}".format(file_path, keys)) df = pd.read_csv(file_path) data = df.loc[:, keys].values.tolist() return data ``` ```python # 将1.json文件放入项目路径中 ./testdata/json/ @pytest.mark.parametrize( "key1, key2", FileData.get_from_json("1.json",['key1','key2'])) def test_read_json_data(self, key1, key2): logger.info("read json data:{},{}".format(key1, key2)) # 将1.csv文件放入项目路径中 ./testdata/csv/ @pytest.mark.parametrize( "key1, key2, key3", FileData.get_from_csv("1.csv",['key1','key2', 'key3'])) def test_read_csv_data(self, key1, key2, key3): logger.info("read csv data:{},{},{}".format(key1, key2, key3)) # 将testdata.xlsx文件放入项目路径中 ./testdata/excel/ @pytest.mark.parametrize( "key1, key2", FileData.get_from_excel("testdata.xlsx",'case1',['key1','key2'])) def test_read_excel_data(self, key1, key2): logger.info("read excel data:{},{}".format(key1, key2)) ``` #### 备注 最新版本chrome和chromedriver下载地址获取 ```python https://googlechromelabs.github.io/chrome-for-testing/ ```