文章目录
*
–
+ 1. V1版本
+ 2.V2版本
+
* V1.原始
* V2.将重复方法简单提取一下(存在问题;代码冗余)
* V3.将重复方法提取成出来,方法封装(存在问题:维护麻烦,没有参数化,如果页面元素发生变化维护起来麻烦)
* V4.Po模式
* V5.Po模式优化
1. V1版本
一个用例一个脚本,维护不方便
2.V2版本
通过pytest执行
配置文件
pytest.ini
addopts = -s -v –html=report/report.html –reruns 1 生成测试报告 用例失败执行一次
[pytest]
addopts = -s -v --html=report/report.html --reruns 1
testpaths = ./V3/./scripts
python_files = test_*.py
python_classes = Test*
python_functions = test_*
V1.原始
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestAdd:
def test_01(self):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://tpshop-test.itheima.net")
driver.find_element(By.CSS_SELECTOR, ".red").click()
driver.find_element(By.NAME, "username").send_keys("13987362332")
driver.find_element(By.NAME, "password").send_keys("123456")
driver.find_element(By.NAME, "verify_code").send_keys("8888")
driver.find_element(By.NAME, "sbtbutton").click()
time.sleep(1)
msg = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
assert "账号不存在" in msg
driver.quit()
def test_02(self):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://tpshop-test.itheima.net")
driver.find_element(By.CSS_SELECTOR, ".red").click()
driver.find_element(By.NAME, "username").send_keys("13012345678")
driver.find_element(By.NAME, "password").send_keys("123")
driver.find_element(By.NAME, "verify_code").send_keys("8888")
driver.find_element(By.NAME, "sbtbutton").click()
time.sleep(1)
msg = driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
assert "密码错误" in msg
driver.quit()
V2.将重复方法简单提取一下(存在问题;代码冗余)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestAdd:
def setup_class(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(10)
self.driver.get("http://tpshop-test.itheima.net")
self.driver.find_element(By.CSS_SELECTOR, ".red").click()
def test_01(self):
self.driver.find_element(By.NAME, "username").send_keys("13987362332")
self.driver.find_element(By.NAME, "password").send_keys("123456")
self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
self.driver.find_element(By.NAME, "sbtbutton").click()
time.sleep(1)
msg = self.driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
print(msg)
assert "账号不存在" in msg
def setup(self):
self.driver.refresh()
def test_02(self):
self.driver.find_element(By.NAME, "username").send_keys("13012345678")
self.driver.find_element(By.NAME, "password").send_keys("123")
self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
self.driver.find_element(By.NAME, "sbtbutton").click()
time.sleep(1)
msg = self.driver.find_element(By.CSS_SELECTOR, ".layui-layer-content").text
assert "密码错误" in msg
def teardown_class(self):
self.driver.quit()
V3.将重复方法提取成出来,方法封装(存在问题:维护麻烦,没有参数化,如果页面元素发生变化维护起来麻烦)
注意:要建立一个conftest.py的空文件,要不然会说V3.utils找不到
utils工具类:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class UtilsDriver:
_driver = None
@classmethod
def get_driver(cls):
if cls._driver is None:
cls._driver = webdriver.Chrome()
cls._driver.maximize_window()
cls._driver.implicitly_wait(10)
return cls._driver
@classmethod
def quit_driver(cls):
if cls._driver is not None:
cls.get_driver().quit()
cls._driver = None
def get_msg():
time.sleep(1)
return UtilsDriver.get_driver().find_element(By.CSS_SELECTOR, ".layui-layer-content").text
代码:
from selenium.webdriver.common.by import By
from V3.utils import UtilsDriver, get_msg
class TestLogin:
def setup_class(self):
self.driver = UtilsDriver.get_driver()
self.driver.get("http://tpshop-test.itheima.net")
self.driver.find_element(By.CSS_SELECTOR, ".red").click()
def test_01(self):
self.driver.find_element(By.NAME, "username").send_keys("13987362332")
self.driver.find_element(By.NAME, "password").send_keys("123456")
self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
self.driver.find_element(By.NAME, "sbtbutton").click()
msg = get_msg()
assert "账号不存在" in msg
def setup(self):
self.driver.refresh()
def test_02(self):
self.driver.find_element(By.NAME, "username").send_keys("13012345678")
self.driver.find_element(By.NAME, "password").send_keys("123")
self.driver.find_element(By.NAME, "verify_code").send_keys("8888")
self.driver.find_element(By.NAME, "sbtbutton").click()
msg = get_msg()
assert "密码错误" in msg
def teardown_class(self):
UtilsDriver.quit_driver()
V4.Po模式
把一个页面分为三层:对象库(封装定位元素方法),操作层(封装元素的操作),业务层(将一个或者多个业务组合起来)
- 首先要知道用到哪些页面,页面里面用到哪些元素
pagehome.py
from selenium.webdriver.common.by import By
from V4.utils import UtilsDriver
class PageHome:
def __init__(self):
self.driver = UtilsDriver.get_driver()
self.login_btn = By.CSS_SELECTOR, ".red"
def find_login_btn(self):
return self.driver.find_element(self.login_btn[0], self.login_btn[1])
class HandleHome:
def __init__(self):
self.home_page = PageHome()
def click_btn_login(self):
self.home_page.find_login_btn().click()
class HomeProxy:
def __init__(self):
self.home_proxy = HandleHome()
def go_login_page(self):
self.home_proxy.click_btn_login()
pagelogin.py
from selenium.webdriver.common.by import By
from V4.utils import UtilsDriver
class PageLogin:
def __init__(self):
self.driver = UtilsDriver.get_driver()
self.account_btn = By.NAME, "username"
self.pwd_btn = By.NAME, "password"
self.keys_btn = By.NAME, "verify_code"
self.input_btn = By.NAME, "sbtbutton"
def find_account_btn(self):
return self.driver.find_element(self.account_btn[0], self.account_btn[1])
def find_pwd_btn(self):
return self.driver.find_element(self.pwd_btn[0], self.pwd_btn[1])
def find_keys_btn(self):
return self.driver.find_element(*self.keys_btn)
def find_input_btn(self):
return self.driver.find_element(*self.input_btn)
class HandleLogin:
def __init__(self):
self.login_page = PageLogin()
def input_account(self, username):
self.login_page.find_account_btn().clear()
self.login_page.find_account_btn().send_keys(username)
def input_pwd(self, pwd):
self.login_page.find_pwd_btn().clear()
self.login_page.find_pwd_btn().send_keys(pwd)
def input_keys(self, keys):
self.login_page.find_keys_btn().clear()
self.login_page.find_keys_btn().send_keys(keys)
def input_click(self):
self.login_page.find_input_btn().click()
class LoginProxy:
def __init__(self):
self.login_proxy = HandleLogin()
def login(self, username, pwd, keys):
self.login_proxy.input_account(username)
self.login_proxy.input_pwd(pwd)
self.login_proxy.input_keys(keys)
self.login_proxy.input_click()
V5.Po模式优化
优化显示等待和清除操作
base_page.py
from selenium.webdriver.support.wait import WebDriverWait
from V4.utils import UtilsDriver
class BasePage:
def __init__(self):
self.driver = UtilsDriver.get_driver()
def get_element(self, location):
wait = WebDriverWait(self.driver, 10, 1)
element = wait.until(lambda x: x.find_element(*location))
return element
class BaseHandler:
def input_text(self, element, text):
element.clear()
element.send_keys(text)
page_home.py
from selenium.webdriver.common.by import By
from V4.base.base_page import BasePage, BaseHandler
from V4.utils import UtilsDriver
class PageHome(BasePage):
def __init__(self):
super().__init__()
self.login_btn = By.CSS_SELECTOR, ".red"
def find_login_btn(self):
return self.get_element(self.login_btn)
class HandleHome(BaseHandler):
def __init__(self):
self.home_page = PageHome()
def click_btn_login(self):
self.home_page.find_login_btn().click()
class HomeProxy:
def __init__(self):
self.home_proxy = HandleHome()
def go_login_page(self):
self.home_proxy.click_btn_login()
page_login.py
from selenium.webdriver.common.by import By
from V4.base.base_page import BaseHandler, BasePage
from V4.utils import UtilsDriver
class PageLogin(BasePage):
def __init__(self):
super().__init__()
self.account_btn = By.NAME, "username"
self.pwd_btn = By.NAME, "password"
self.keys_btn = By.NAME, "verify_code"
self.input_btn = By.NAME, "sbtbutton"
def find_account_btn(self):
return self.get_element(self.account_btn)
def find_pwd_btn(self):
return self.get_element(self.pwd_btn)
def find_keys_btn(self):
return self.get_element(self.keys_btn)
def find_input_btn(self):
return self.get_element(self.input_btn)
class HandleLogin(BaseHandler):
def __init__(self):
self.login_page = PageLogin()
def input_account(self, username):
self.input_text(self.login_page.find_account_btn(), username)
def input_pwd(self, pwd):
self.input_text(self.login_page.find_pwd_btn(), pwd)
def input_keys(self, keys):
self.input_text(self.login_page.find_keys_btn(), keys)
def input_click(self):
self.login_page.find_input_btn().click()
class LoginProxy:
def __init__(self):
self.login_proxy = HandleLogin()
def login(self, username, pwd, keys):
self.login_proxy.input_account(username)
self.login_proxy.input_pwd(pwd)
self.login_proxy.input_keys(keys)
self.login_proxy.input_click()
Original: https://blog.csdn.net/weixin_42693712/article/details/124761657
Author: highfish920
Title: Pytest-PO模式
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/772562/
转载文章受原作者版权保护。转载请注明原作者出处!