|
import allure
|
|
from selenium.common import NoSuchElementException
|
|
from selenium.webdriver.common.by import By
|
|
|
|
from page.home_page import HomePage
|
|
from utils.logger import logger
|
|
|
|
|
|
class IssuePage(HomePage):
|
|
_CreateIssue = (By.CSS_SELECTOR, ".new-issue")
|
|
_IssueName = (By.CSS_SELECTOR, "#issue_subject")
|
|
# 跟踪
|
|
_TRACKER = (By.CSS_SELECTOR, "#issue_tracker_id>option[selected='selected']")
|
|
# 优先级下拉框
|
|
# Priority_select = (By.CSS_SELECTOR, "#issue_priority_id")
|
|
# 默认的优先级数据列表
|
|
_Priority_list = ['Low', 'Normal', 'High', 'Urgent', 'Immediate']
|
|
# 指派人
|
|
_Assign = (By.CSS_SELECTOR, ".assign-to-me-link")
|
|
_StartTime = (By.CSS_SELECTOR, "#issue_start_date")
|
|
_DueTime = (By.CSS_SELECTOR, "#issue_due_date")
|
|
# 描述信息
|
|
_Description = (By.CSS_SELECTOR, "#issue_description")
|
|
_File = (By.XPATH, "//*[@type='file']")
|
|
_Commit = (By.CSS_SELECTOR, "[name='commit']")
|
|
_Edit = (By.CSS_SELECTOR, ".icon.icon-edit")
|
|
_NoAssign = (By.CSS_SELECTOR, "#issue_assigned_to_id>option")
|
|
_issue_status_list = ['In Progress', 'Resolved', 'Feedback', 'Closed', 'Rejected', 'New']
|
|
_UpdateDescription = (By.CSS_SELECTOR, "#issue_notes")
|
|
|
|
@allure.step("点击新建问题")
|
|
def to_create_issue(self):
|
|
logger.info("点击新建问题")
|
|
self.find_and_click(*self._CreateIssue)
|
|
return self
|
|
|
|
@allure.step("填写issue信息")
|
|
def write_issue_messages(self, issue_name, priority=None, start_time=None, due_time=None, description=None, file_path=None, time_prefix="00"):
|
|
"""
|
|
:param issue_name:
|
|
:param priority: 优先级
|
|
:param start_time: 开始时间
|
|
:param due_time: 预计完成时间
|
|
:param description: 描述
|
|
:param file_path: 上传文件的路径
|
|
:param time_prefix: 时间的前缀,用来拼接时间,作用于时间组件
|
|
:return:
|
|
"""
|
|
# 日期格式:002024-02-01
|
|
logger.info("填写issue信息")
|
|
if not issue_name:
|
|
return self
|
|
self.find_and_send(issue_name, *self._IssueName)
|
|
if description:
|
|
self.find_and_send(description, *self._Description)
|
|
if priority and priority in self._Priority_list:
|
|
_Priority = (By.XPATH, f"//*[text()='{priority}']")
|
|
self.find_and_click(*_Priority)
|
|
if start_time:
|
|
self.find_and_send(time_prefix+start_time, *self._StartTime)
|
|
if due_time:
|
|
self.find_and_send(time_prefix+due_time, *self._DueTime)
|
|
# 将issue指派给我
|
|
self.find_and_click(*self._Assign)
|
|
if file_path:
|
|
self.find_and_send(file_path, *self._File)
|
|
return self
|
|
|
|
@allure.step("提交信息")
|
|
def commit(self):
|
|
logger.info("提交信息")
|
|
self.set_time(0.5)
|
|
self.finds(*self._Commit)[-1].click()
|
|
return self
|
|
|
|
@allure.step("点击编辑按钮")
|
|
def edit_issue(self):
|
|
logger.info("点击编辑按钮")
|
|
self.find_and_click(*self._Edit)
|
|
return self
|
|
|
|
@allure.step("修改issue信息")
|
|
def update_project_messages(self, issue_name=None, priority=None, start_time=None, due_time=None, description=None, status=None):
|
|
# 日期格式:002024-02-01
|
|
logger.info("修改issue信息")
|
|
if issue_name:
|
|
self.find_and_send(issue_name, *self._IssueName)
|
|
if description:
|
|
self.find_and_send(description, *self._UpdateDescription)
|
|
if priority and priority in self._Priority_list:
|
|
_Priority = (By.XPATH, f"//*[text()='{priority}']")
|
|
self.find_and_click(*_Priority)
|
|
if start_time:
|
|
self.find_and_send("00"+start_time, *self._StartTime)
|
|
if due_time:
|
|
self.find_and_send("00"+due_time, *self._DueTime)
|
|
# 将指派取消
|
|
self.find_and_click(*self._NoAssign)
|
|
# 更改issue状态
|
|
if status and status in self._issue_status_list:
|
|
_Status = (By.XPATH, f"//option[text()='{status}']")
|
|
self.find_and_click(*_Status)
|
|
return self
|
|
|
|
@allure.step("删除issue")
|
|
def delete_issue(self, name, handle: bool):
|
|
logger.info("删除issue")
|
|
data = (By.XPATH, f"//*[@class='subject']/a[text()='{name}']/../..//*[@title='行为']")
|
|
delete = (By.CSS_SELECTOR, ".icon.icon-del")
|
|
self.find_and_click(*data)
|
|
self.set_time(0.5)
|
|
self.find_and_click(*delete)
|
|
self.handle_alert(handle)
|
|
return self
|
|
|
|
def handle_alert(self, handle: bool):
|
|
# 切换到alert弹窗,根据参数判断是接受还是取消
|
|
alert = self._driver.switch_to.alert
|
|
if handle:
|
|
logger.info("确认删除")
|
|
alert.accept()
|
|
else:
|
|
logger.info("取消删除")
|
|
alert.dismiss()
|
|
return self
|
|
|
|
@allure.step("断言页面数据是否存在")
|
|
def get_undelete_data(self, name):
|
|
# 删除操作后,断言数据是否在页面存在
|
|
data = (By.XPATH, f"//*[@class='subject']/a[text()='{name}']")
|
|
try:
|
|
self.find(*data)
|
|
logger.info("数据未删除")
|
|
except NoSuchElementException:
|
|
return False
|
|
return True
|
|
|
|
@allure.step("断言创建后的issue信息")
|
|
def assert_page_information(self):
|
|
# 断言页面信息
|
|
_title = (By.CSS_SELECTOR, ".subject h3")
|
|
_status = (By.CSS_SELECTOR, ".status.attribute>div.value")
|
|
_start_time = (By.CSS_SELECTOR, ".start-date.attribute>div.value")
|
|
_priority = (By.CSS_SELECTOR, ".priority.attribute>div.value")
|
|
_assigned = (By.CSS_SELECTOR, ".assigned-to.attribute>div.value")
|
|
# 计划完成日期
|
|
_due_time = (By.CSS_SELECTOR, ".due-date.attribute>div.value")
|
|
# 完成百分比
|
|
_percentage = (By.CSS_SELECTOR, ".progress.attribute p.percent")
|
|
# 预期时间
|
|
_expected_time = (By.CSS_SELECTOR, ".estimated-hours.attribute>div.value")
|
|
page_information = {'title': self.get_text(*_title),
|
|
'status': self.get_text(*_status),
|
|
'start_time': self.get_text(*_start_time),
|
|
'priority': self.get_text(*_priority),
|
|
'due_time': self.get_text(*_due_time),
|
|
'assigned': self.get_text(*_assigned),
|
|
'percentage': self.get_text(*_percentage),
|
|
'expected_time': self.get_text(*_expected_time)}
|
|
return page_information
|
|
|
|
@allure.step("获取页面展示的文件信息")
|
|
def get_file_message(self):
|
|
_file_name = (By.CSS_SELECTOR, "a.icon.icon-attachment")
|
|
return self.get_text(*_file_name)
|
|
|
|
|