pytest-架構1
參考:http://www.rzrgm.cn/linuxchao/p/linuxchao-pytest-Actual.html
目錄
架構結構

config

|-config
|-|-init.py
|-|-conf.py
|-|-config.ini
conf.py
放的是一些配置信息,全局變量,比如根目錄在哪兒

使用方法:
config.ini
放的是一些xpath的位置
- INI文件的格式很簡單,最基本的三個要素是:parameters,sections和comments。
- INI所包含的最基本的“元素”就是parameter;每一個parameter都有一個name和一個value
- 所有的parameters都是以sections為單位結合在一起的
- 在INI文件中注釋語句是以分號“;”開始的
![]()
使用方法:
# 用戶名輸入框
username = do_conf.get_locators_or_account('LoginPageElements', 'username')
# 密碼輸入框
password = do_conf.get_locators_or_account('LoginPageElements', 'password')
data

|-data
|-|-init.py
|-|-attachment
|-|-contact_data.py
|-|-login_data.py
|-|-send_mail_data.py
|-|-tcData.xlsx
attachmen
這是發信用的附件

login_data.py
這里存放的是測試數據,比如登錄需要什么數據就寫在這里
寫法上用類的方法
調用方法:
login_data = LoginData
@pytest.mark.parametrize('username, password, expect', login_data.login_success_data)
class LoginData(object):
"""用戶登錄測試數據"""
login_success_data = [
(
"daido1",
"daido001",
"ログアウト"
)
]
login_fail_data = [
(
"daido1",
"daido11111111",
" 登錄失敗"
),
(
"daido111111111",
"daido001",
" 登錄失敗"
),
(
"linux",
"xiaochao",
" 登錄失敗"
)
]

if __name__ == '__main__':
pass
tcData.xlsx

Page

BasePage.py
存放一些共通方法
class BasePage(object):
"""結合顯示等待封裝一些selenium內置方法"""
def __init__(self, driver, timeout=30):
self.byDic = {
'id': By.ID,
'name': By.NAME,
'class_name': By.CLASS_NAME,
'xpath': By.XPATH,
'link_text': By.LINK_TEXT
}
self.driver = driver
self.outTime = timeout
def find_element(self, by, locator):
"""
find alone element
:param by: eg: id, name, xpath, css.....
:param locator: id, name, xpath for str
:return: element object
"""
def find_elements(self, by, locator):
"""
find group elements
:param by: eg: id, name, xpath, css.....
:param locator: eg: id, name, xpath for str
:return: elements object
"""
def is_element_exist(self, by, locator):
"""
assert element if exist
:param by: eg: id, name, xpath, css.....
:param locator: eg: id, name, xpath for str
:return: if element return True else return false
"""
def is_alert(self):
"""
assert alert if exsit
:return: alert obj
"""
def switch_to_frame(self, by, locator):
"""判斷frame是否存在,存在就跳到frame"""
def switch_to_default_frame(self):
"""返回默認的frame"""
def get_alert_text(self):
"""獲取alert的提示信息"""
def get_element_text(self, by, locator, name=None):
"""獲取某一個元素的text信息"""
def load_url(self, url):
"""加載url"""
def get_source(self):
"""獲取頁面源碼"""
def send_keys(self, by, locator, value=''):
"""寫數據"""
def clear(self, by, locator):
"""清理數據"""
def click(self, by, locator):
"""點擊某個元素"""
def sleep(num=0):
"""強制等待"""
def ctrl_v(self, value):
"""ctrl + V 粘貼"""
def enter_key():
"""enter 回車鍵"""
def wait_element_to_be_located(self, by, locator):
"""顯示等待某個元素出現,且可見"""
def get_page_source(self):
return self.get_source()
LoginPage.py
存放頁面的方法
class LoginPage(BasePage):
# 配置文件讀取元素
do_conf = ParseConFile()
# 選擇密碼登錄的按鈕
password_login_btn = do_conf.get_locators_or_account('LoginPageElements', 'password_login_btn')
# 登錄框外的iframe
frame = do_conf.get_locators_or_account('LoginPageElements', 'frame')
def login(self, username, password):
"""登錄流程"""
self.open_url()
self.click_password_login_btn()
# self.switch_login_frame()
self.input_username(username)
self.input_password(password)
self.click_login_btn()
def open_url(self):
return self.load_url('http://daido.sitetest1.com/')
#return self.load_url('https://mail.126.com')
def click_password_login_btn(self):
return self.click(*LoginPage.password_login_btn)
def switch_login_frame(self):
return self.switch_to_frame(*LoginPage.frame)
def clear_username(self):
return self.clear(*LoginPage.username)
def input_username(self, username):
self.clear_username()
return self.send_keys(*LoginPage.username, username)
def clear_password(self):
return self.clear(*LoginPage.password)
def input_password(self, password):
self.clear_password()
return self.send_keys(*LoginPage.password, password)
def click_login_btn(self):
return self.click(*LoginPage.loginBtn)
def switch_default_frame(self):
return self.switch_to_default_frame()
def get_error_text(self):
return self.get_element_text(*LoginPage.error_head)
def get_login_success_account(self):
return self.get_element_text(*LoginPage.account)
if __name__ == "__main__":
pass
util

這里存放的是一些封裝好的方法
TestCases

@pytest.mark.loginTest
class TestLogin(object):
"""登錄"""
login_data = LoginData
@pytest.mark.parametrize('username, password, expect', login_data.login_success_data)
def test_login(self, open_url, username, password, expect):
login_page = open_url
login_page.login(username, password)
time.sleep(3)
actual = login_page.get_login_success_account()
assert expect in actual, "登錄成功, 斷言失敗"
login_page.switch_default_frame()
@pytest.mark.parametrize('username, password, expect', login_data.login_fail_data)
def test_fail(self, open_url, username, password, expect):
login_page = open_url
login_page.login(username, password)
actual = login_page.get_error_text()
assert actual == expect, "登錄失敗, 斷言失敗"
if __name__ == "__main__":
pytest.main(['-v', 'test_loginCase.py'])


浙公網安備 33010602011771號