页面封装
test
pages
basePage.py
基础页面封装
# -*-coding:utf-8-*-
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
class BasePage(object):
"""基础页面"""
def __init__(self, driver=None, base_url=None):
"""
基础的参数,webdriver、默认访问的url
:param driver: 浏览器驱动
:param base_url: 默认打开url,一般都是登录页面
"""
if driver is None:
current_path = os.path.abspath(os.path.dirname(__file__))
driver_path = current_path + '/../../drivers/chromedriver.exe'
self.driver = webdriver.Chrome(driver_path)
else:
self.driver = driver
if base_url is None:
self.base_url = 'http://localhost:21248/#/'
else:
self.base_url = base_url
# 设置默认打开的页面
self.open_page()
def open_page(self):
"""打开默认页面"""
self.driver.maximize_window()
self.driver.implicitly_wait(10)
self.driver.get(self.base_url)
sleep(1)
def close_page(self):
"""关闭页面"""
return self.driver.close()
def quit_driver(self):
"""关闭页面并且退出程序"""
return self.driver.quit()
def find_element(self, by, element):
"""返回单个定位元素"""
sleep(1)
return self.driver.find_element(by, element)
def find_elements(self, by, element):
"""返回一组定位元素"""
sleep(1)
return self.driver.find_elements(by, element)
def switch_alert(self):
"""返回弹窗页面"""
sleep(1)
return self.driver.switch_to.alert
def select_menu(self, menu_text=None):
"""菜单选择"""
sleep(1)
menus_element = self.driver.find_elements(By.CSS_SELECTOR, "#menu>div>h4")
for menu in menus_element:
# replace(" ", "")去掉字符串中的空格
if menu.text.replace(" ", "") == menu_text.replace(" ", ""):
return menu.click()
print(menu_text + "未找到")
return
def log_out(self):
"""退出登录"""
return self.select_menu("退出登录")
test
pages
loginPage.py
登录页面封装
# -*-coding:utf-8-*-
import os
from selenium.webdriver.common.by import By
from test.pages.basePage import BasePage
from utils.readConfig import ReadConfig
class LoginPage(BasePage):
"""登录页面"""
def email_element(self):
"""邮箱地址"""
return self.find_element(By.CLASS_NAME, "email")
def password_element(self):
"""密码"""
return self.find_element(By.CLASS_NAME, "password")
def login_button(self):
"""登录按钮"""
return self.find_element(By.CSS_SELECTOR, ".login-btn>input[value='登 录']")
def email_error_element(self):
"""邮箱地址错误"""
return self.find_element(By.CSS_SELECTOR, ".email+div.msg")
def password_error_element(self):
"""密码错误"""
return self.find_element(By.CSS_SELECTOR, ".password+div.msg")
def login_fail_element(self):
"""登录失败"""
return self.switch_alert()
def login(self, email=None, password=None):
"""登录操作"""
account_email, account_password = self.get_account()
if email is None:
email = account_email
else:
email = email
if password is None:
password = account_password
self.email_element().send_keys(email)
self.password_element().send_keys(password)
self.login_button().click()
@staticmethod
def get_account():
"""获取默认邮箱地址和密码"""
current_path = os.path.abspath(os.path.dirname(__file__))
json_path = current_path + '/../../config/base_data.json'
account = ReadConfig().read_json(json_path)
return account['email'], account['password']
if __name__ == '__main__':
a = LoginPage()
a.login()
a.quit_driver()
test
pages
homePage.py
主页页面封装
# -*-coding:utf-8-*-
from time import sleep
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
from test.common.tableOperation import TableOperation
class HomePage(LoginPage):
"""主页页面"""
# 检索
def search_input_element(self):
"""检索输入框"""
return self.find_element(By.ID, "search-input")
def search_button_element(self):
"""检索按钮"""
return self.find_element(By.CLASS_NAME, "search")
# 按钮
def add_button_element(self):
"""新增按钮"""
return self.find_element(By.ID, "add")
def edit_button_element(self):
"""编辑按钮"""
return self.find_element(By.ID, "edt")
def delete_button_element(self):
"""删除按钮"""
return self.find_element(By.ID, "del")
# 编辑弹窗
def edit_code_element(self):
"""学号输入框"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog .code")
def edit_name_element(self):
"""姓名输入框"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog .name")
def edit_sex_element(self):
"""性别输入框"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog .sex")
def edit_grader_element(self):
"""年级输入框"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog .grader")
def edit_confirm_button_element(self):
"""编辑确定按钮"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog #confirm")
def edit_cancel_button_element(self):
"""编辑取消按钮"""
return self.find_element(By.CSS_SELECTOR, "#add-dialog #cancel")
# 删除弹窗
def del_confirm_button_element(self):
"""删除确定按钮"""
return self.find_element(By.CSS_SELECTOR, "#del-dialog #confirm")
def del_cancel_button_element(self):
"""删除取消按钮"""
return self.find_element(By.CSS_SELECTOR, "#del-dialog #cancel")
# 页面操作方法
def search(self, text):
"""检索操作"""
self.search_input_element().clear()
self.search_input_element().send_keys(text)
self.search_button_element().click()
def edit_dialog(self, code=None, name=None, sex=None, grader=None, button=None):
"""编辑弹窗操作"""
if code is not None:
self.edit_code_element().clear()
self.edit_code_element().send_keys(code)
if name is not None:
self.edit_name_element().clear()
self.edit_name_element().send_keys(name)
if sex is not None:
self.edit_sex_element().clear()
self.edit_sex_element().send_keys(sex)
if grader is not None:
self.edit_grader_element().clear()
self.edit_grader_element().send_keys(grader)
if button == "确定":
self.edit_confirm_button_element().click()
elif button == "取消":
self.edit_cancel_button_element().click()
else:
print("编辑弹窗中按钮只能是确定和取消")
def add_data(self, code, name, sex=None, grader=None, button="确定"):
"""
由于code、name为必输项,所有一定要接收参数
但sex、grader为非必输项,所有可以不用传值,默认参数设置为None
:param code:学号,必输项
:param name:姓名,必输项
:param sex:性别,非必输
:param grader:年级,非必输
:param button:新增时按钮一般都是确认按钮,所有按钮的默认值传入确定
:return:
"""
self.add_button_element().click()
self.edit_dialog(code, name, sex, grader, button)
def edit_data(self, header_text, row_text, code=None, name=None, sex=None, grader=None, button="确定"):
"""编辑数据"""
# 使用row_click()方法是为了直接选择要编辑的数据
TableOperation(self.driver).row_click(header_text, row_text)
self.edit_button_element().click()
self.edit_dialog(code, name, sex, grader, button)
def delete_data(self, header_text, row_text, button="确定"):
"""编辑数据"""
# 使用row_click()方法是为了直接选择要删除的数据
TableOperation(self.driver).row_click(header_text, row_text)
self.delete_button_element().click()
if button == "确定":
self.del_confirm_button_element().click()
elif button == "取消":
self.del_cancel_button_element().click()
else:
print("编辑弹窗中按钮只能是确定和取消")
"""
测试代码
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
a = LoginPage(driver)
a.login()
home = HomePage(driver)
home.add_data('1001', "张三")
home.search("张三")
home.edit_data('姓 名', "张三", name="李四")
home.search("李四")
sleep(1)
home.delete_data('姓 名', "李四")
sleep(3)
a.quit_driver()
"""
test
pages
aboutPage.py
关于我们页面封装
# -*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
class AboutPage(LoginPage):
"""关于我们页面"""
def about_element(self):
"""关于我们页面判断元素"""
return self.find_element(By.CSS_SELECTOR, "#about h1")