Commit 346c94fa by Administrator

2.19提交

parent e20a0da0
......@@ -2,6 +2,7 @@ import time
import pyautogui
import pyperclip
from selenium.webdriver import Keys
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
......@@ -18,8 +19,6 @@ class BasePage:
def __init__(self):
self.driver = DriverUtils.get_web_driver()
self.logger = None
self.set_logger()
# 查找元素
......@@ -36,7 +35,13 @@ class BasePage:
# 定义该元素对于的文本
ele = self.find_el(loc)
# 先清空
ele.clear()
# ele.clear()
# 使用 JavaScript 强制清空输入框中的文本
# self.driver.execute_script("arguments[0].value = '';", ele)
# 使用键盘操作选中并删除文本
time.sleep(1)
ele.send_keys(Keys.CONTROL + "a") # 选中所有文本
ele.send_keys(Keys.DELETE) # 删除选中的文本
# 再输入
ele.send_keys(value)
......@@ -63,6 +68,11 @@ class BasePage:
# 调用select选择方法
sle.select_by_visible_text(text)
def get_text_loc(self,loc):
return self.find_el(loc).get_attribute("innerText")
def get_text_ele(self, ele):
return ele.get_attribute("innerText")
# 选择文件
def select_document(self,path_str=None):
time.sleep(1)
......@@ -87,38 +97,38 @@ class BasePage:
pyautogui.press('enter') # 模拟按下回车键
time.sleep(2)
# 设置日志记录器
def set_logger(self):
# 检查记录器是否已经存在,如果存在,则直接返回
if self.logger:
return
logging.basicConfig(level=logging.INFO)
self.logger = logging.getLogger(__name__)
# 创建一个处理程序,用于输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建一个处理程序,用于输出到文件
self.file_handler = logging.FileHandler('business_knowledge1.log', encoding='utf-8')
self.file_handler.setLevel(logging.INFO)
# 创建一个格式化器,用于设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将格式化器添加到处理程序
console_handler.setFormatter(formatter)
self.file_handler.setFormatter(formatter)
# 先清空已有的处理程序
self.logger.handlers.clear()
# 检查记录器中是否已经存在相同类型的处理程序,如果不存在,则添加
if console_handler not in self.logger.handlers:
self.logger.addHandler(console_handler)
if self.file_handler not in self.logger.handlers:
self.logger.addHandler(self.file_handler)
print(len(self.logger.handlers))
def log_info(self, message):
self.logger.info(message)
# # 设置日志记录器
# def set_logger(self):
# # 检查记录器是否已经存在,如果存在,则直接返回
# if self.logger:
# return
#
# logging.basicConfig(level=logging.INFO)
# self.logger = logging.getLogger(__name__)
# # 创建一个处理程序,用于输出到控制台
# console_handler = logging.StreamHandler()
# console_handler.setLevel(logging.INFO)
# # 创建一个处理程序,用于输出到文件
# self.file_handler = logging.FileHandler('business_knowledge1.log', encoding='utf-8')
# self.file_handler.setLevel(logging.INFO)
# # 创建一个格式化器,用于设置日志格式
# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# # 将格式化器添加到处理程序
# console_handler.setFormatter(formatter)
# self.file_handler.setFormatter(formatter)
# # 先清空已有的处理程序
# self.logger.handlers.clear()
# # 检查记录器中是否已经存在相同类型的处理程序,如果不存在,则添加
# if console_handler not in self.logger.handlers:
# self.logger.addHandler(console_handler)
# if self.file_handler not in self.logger.handlers:
# self.logger.addHandler(self.file_handler)
# print(len(self.logger.handlers))
#
def close_logger(self):
self.file_handler.close()
# def log_info(self, message):
# self.logger.info(message)
# #
# def close_logger(self):
# self.file_handler.close()
......@@ -34,12 +34,17 @@ class BusinessKnowledgePage(BasePage):
self.folders = (By.XPATH, '//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/div[2]') # 文件夹列表
self.newFolder = (By.XPATH, '//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/button[2]/span') # 新建文件夹
self.folderName = (By.XPATH, '//*[@id="folderName"]') # 输入文件夹名
self.select_folder = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/div[2]/div[@class="Catalog-item active"]/span')
self.ensure = (By.XPATH, '/html/body/div[3]/div/div[2]/div/div[2]/div[3]/button[2]/span') # 确定按钮
self.more = (By.XPATH, '//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/div[2]/div[3]/i') # 更多
self.updateFolderName = (By.XPATH, '/html/body/div[3]/div/div/ul/li[1]/span/div') # 修改名称
self.deleteFolder = (By.XPATH, '/html/body/div[3]/div/div/ul/li[2]/span/div') # 删除
self.ensureDelete = (By.XPATH, '/html/body/div[4]/div/div[2]/div/div[2]/div[3]/button[2]/span') # 确认
self.moreFolderName = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/div[2]/div[3]/span')
self.searchInputText = (
By.XPATH, '//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[1]/div[1]/span/input') # 搜索文本框
self.subscriptionWebsiteButton = (
......@@ -100,6 +105,10 @@ class BusinessKnowledgePage(BasePage):
self.input_text_by_loc(self.folderName, updateFolderName)
time.sleep(1)
self.find_el(self.ensureDelete).click() # 点击确认
time.sleep(1)
# 返回修改后的文件名
return self.get_text_loc(self.moreFolderName)
# 遍历点击文件夹
def traverseFolder(self):
......@@ -116,6 +125,29 @@ class BusinessKnowledgePage(BasePage):
def searchDocument(self, keyName=None):
self.input_text_by_loc(self.searchInputText, keyName)
time.sleep(2)
# 返回搜索到的所有文档
folders = self.find_el(self.folders).find_elements(By.XPATH,"./div")
documents = []
for folder in folders:
folder.click()
time.sleep(1)
# 获取所有文档
documentStep = self.find_el(self.document_list_helper.documentListDiv).find_elements(By.XPATH,"./tr")
documents.extend(documentStep)
print(documents)
return documents
# 判断这些文档中是否存在某些关键词
def isExistKeyInDocument(self,key_name=None,documents=None):
flag = True
for document in documents:
actual_document_name = document.find_element(By.XPATH,"./td[2]/div/div").getAttribute("title")
if not actual_document_name.find(key_name):
flag = False
logger.info("搜索失败,搜索出额外文档")
return flag
"""
网站订阅
......@@ -217,7 +249,7 @@ class UploadDocumentHelper(BasePage):
self.ensureButton = (By.XPATH,'/html/body/div[3]/div/div[2]/div/div[2]/div[3]/div/button[2]') # 确定
self.urlText = (By.XPATH,'//*[@id="url"]')
self.getContentButton = (By.CLASS_NAME,'ant-btn ant-btn-primary')
self.getContentButtons = (By.CLASS_NAME,'btn-wrap')
"""
方式一:上传文档
......@@ -253,13 +285,9 @@ class UploadDocumentHelper(BasePage):
time.sleep(1)
self.input_text_by_loc(self.urlText,url_link)
time.sleep(2)
button = self.find_el(self.getContentButton)
# 使用 ActionChains 将鼠标移动到按钮上再点击
action = ActionChains(driver)
action.move_to_element(button).click().perform()
# 使用JavaScript将焦点移动到页面其他元素,使文本域失去焦点
# driver.execute_script("arguments[0].blur();", text_area)
time.sleep(2)
buttons = self.find_el(self.getContentButtons).find_elements(By.XPATH,"./button")
buttons[1].click()
time.sleep(4)
"""
......@@ -281,6 +309,7 @@ class DocumentListControlHelper(BasePage):
# self.documents = self.find_son_elements(self.find_el(self.documentListDiv), self.documentDiv)
self.controlList = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[2]/div/div[2]/div[3]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[5]/div/span/ul')
self.firstDocument = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div/div[2]/div/div[2]/div[2]/div/div/div/div/div/div/div/table/tbody/tr[1]/td[3]/div/span')
# 删除
def documentListDeleteControl(self,count=None):
documents = self.find_son_elements(self.find_el(self.documentListDiv), self.documentDiv)
......@@ -406,6 +435,11 @@ class DocumentListControlHelper(BasePage):
"""
文档对话
"""
"""
文档对话
"""
class DocumentDialogueHelper(BasePage):
def __init__(self):
super().__init__()
......@@ -423,11 +457,12 @@ class DocumentDialogueHelper(BasePage):
self.minificationButton = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[2]/div/div[1]/div[2]/i[1]')
# 放大
self.maxficationButton = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[2]/div/div[1]/div[2]/i[2]')
# 全屏
self.fullScreenButton = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[2]/div/div[1]/div[2]/i[3]')
# 下拉
self.xialaButton = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[2]/div/div[1]/div[2]/div[1]')
self.xialaDataList = (By.XPATH,'/html/body/div[6]/div/div/div/div[2]/div[1]/div/div')
self.fangdaButton = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[2]/div/div[1]/div[2]/div[1]')
self.fangdaDataList = (By.CLASS_NAME,'rc-virtual-list-holder-inner')
# 对话 文档解读 笔记
self.typeButtons = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[3]/ul')
# 推荐问题
......@@ -443,6 +478,9 @@ class DocumentDialogueHelper(BasePage):
# 对话内容
self.dialogueContent = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[3]/div[2]')
# 导出解读
self.deriveDocumentSummary = (By.XPATH,'//*[@id="App"]/div/section/div[1]/div[2]/div/div[1]/div/div/div[3]/button')
# 文件夹对话入口
def folderDialogueControl(self):
self.find_el(self.folderDialogueButton).click()
......@@ -502,20 +540,66 @@ class DocumentDialogueHelper(BasePage):
logger.info(f"-------------全屏操作--------")
time.sleep(1)
# 对话 文档解读 笔记 1 2 3
def menu_types_control(self, type=None):
time.sleep(1)
menus = self.find_el(self.typeButtons).find_elements(By.XPATH,"./li")
i = 0
for menu in menus:
if type == i:
if (type-1) == i:
menu.click()
menu_name = menu.find_element(By.XPATH, "./span").get_attribute("innerText")
logger.info(f"此时菜单点击的为:{menu_name}")
time.sleep(1)
return
i = i+1
# self.close_logger()
# 选择特定的放大倍数
def select_magnification_by(self,magnification_value):
magnification_value = str(magnification_value)+"%"
self.find_el(self.fangdaButton).click()
time.sleep(1)
magnificatios = self.find_el(self.fangdaDataList).find_elements(By.XPATH,"./div") # 获取所有的方法倍数数据
for magnification in magnificatios:
title_name = magnification.get_attribute("title")
if title_name == magnification_value:
magnification.click() # 点击完成
logger.info(f"点击选择了{title_name}")
return
# 滑动查看文章内容
"""
对话内容可:添加到笔记 复制 点赞 点踩
文档解读内容可:添加到笔记 复制
笔记可:复制 删除
添加到笔记 复制 点赞 点踩 删除
1 2 3 4 5
"""
def small_control(self, menu_type = None ):
pass
# 导出解读
def derive_document_summary_control(self):
self.menu_types_control(2)
time.sleep(1)
self.find_el(self.deriveDocumentSummary).click()
logger.info("点击文档解读")
# 导出笔记
def derive_note_control(self):
self.menu_types_control(3)
time.sleep(1)
self.find_el(self.deriveDocumentSummary).click()
logger.info("点击导出笔记")
# 推荐问题
def recommend_control(self, count=None):
......@@ -523,10 +607,15 @@ class DocumentDialogueHelper(BasePage):
self.find_el(self.recommendButton).click()
time.sleep(1)
questions = self.find_el(self.recommendQuestionsDataList).find_elements(By.XPATH,"./li")
logger.info(f"此处有{len(questions)}个推荐问题")
time.sleep(1)
questions[count-1].click()
question_name = questions[count-1].get_element(By.XPATH,"./div/span/div/span/div/span/span[2]").get_attribute("innerText")
logger.info(f"选择的问题为{question_name}")
time.sleep(9)
# 切换对话的对象 文件夹/文档
# 输入问题并点击发送
def send_question_control(self, question=None):
time.sleep(1)
......@@ -558,13 +647,16 @@ if __name__ == '__main__':
time.sleep(1)
businessKnowledge.document_dialogue_helper.folderDialogueControl()
time.sleep(1)
businessKnowledge.document_dialogue_helper.menu_types_control(1)
businessKnowledge.document_dialogue_helper.select_magnification_by("50")
time.sleep(2)
# businessKnowledge.document_dialogue_helper.menu_types_control(1)
# businessKnowledge.document_dialogue_helper.toggle_document_control()
# businessKnowledge.document_dialogue_helper.toggle_document_folder_dialogue_control()
# businessKnowledge.document_list_helper.copy_document_control(2,"团队共享知识库")
# businessKnowledge.document_list_helper.documentListDialogueControl(2)
# businessKnowledge.document_list_helper.documentListControl(3)
time.sleep(2)
# businessKnowledge.upload_document_helper.uploadUrlControl("https://blog.csdn.net/FezZZZ/article/details/120878765")
# time.sleep(2)
......
from selenium.webdriver.common.by import By
from Pages.businessKnowledge_page import BusinessKnowledgePage
from Pages.login_page import LoginPage
from Util.Util import DriverUtils
import time
from loguru import logger
class TestBusinessKnowledge:
def setup_class(self):
# 在所有的测试用例脚本之前执行一次
# 完成公共部分初始化
self.driver = DriverUtils.get_web_driver()
self.login_page = LoginPage()
self.business_page = BusinessKnowledgePage()
def teardown_class(self):
# 在所有的测试用例脚本之后执行一次
self.driver.quit()
pass
def setup_method(self):
# 在每个测试用例脚本之前执行一次
self.driver.get('https://rays7.raysgo.com/login')
self.login_page.login_username("17373027967","3149390154Li")
self.business_page.entranceAi() # 进入AI编辑室
self.business_page.entranceBusinessKnowledge() # 进入企业知识库
time.sleep(3)
def teardown_method(self):
# 在每个测试用例脚本之后执行一次
pass
# 新建文件夹 0-20 重复文件名
def test_newFolder_case001(self):
folder_name = "XXXXX"
self.business_page.newFolderControl(folder_name)
time.sleep(3)
# 断言
folders = self.business_page.find_el(self.business_page.folders).find_elements(By.XPATH,".//span")
assert folder_name == self.business_page.get_text_ele(folders[(len(folders)-1)])
logger.info("新建文件成功")
# 更新文件夹名字 0-20 重复文件名
def test_updateFolder_case001(self):
expect_folder_name = "xxxx322x"
actual_folder_name = self.business_page.updateFolderControl(expect_folder_name)
time.sleep(2)
# 断言
assert actual_folder_name == expect_folder_name
logger.info("更新文件名字成功")
# 删除文件夹
def test_deleteFolder_case001(self):
self.business_page.deleteFolderControl()
# 切换文件夹
def test_traverse_folder(self):
try:
self.business_page.traverseFolder()
assert 1 == 1
except Exception as e:
logger.info("错误类型:{e}")
# 搜索
def test_search_document(self, key_name = "世界"):
try:
documents = self.business_page.searchDocument(key_name)
flag = self.business_page.isExistKeyInDocument(key_name,documents)
assert flag == True
except Exception as e:
logger.info(f"发生报错:报错信息为{e}")
# 文档上传
def test_upload_document_case001(self):
stry_paths = []
stry_paths.append("t"+str(0+1)+".txt")
self.business_page.upload_document_helper.uploadDocumentControl(stry_paths)
time.sleep(10)
# 断言
assert "学习成功" == self.business_page.get_text_ele(self.business_page.document_list_helper.firstDocument)
# 导入网站
def test_upload_website_case001(self):
self.business_page.upload_document_helper.uploadUrlControl("https://blog.csdn.net/FezZZZ/article/details/120878765")
time.sleep(10)
# 断言
assert "学习成功" == self.business_page.get_text_ele(self.business_page.document_list_helper.firstDocument)
......@@ -15,3 +15,5 @@ class DriverUtils:
cls.__driver.implicitly_wait(10)
return cls.__driver
......@@ -4,3 +4,7 @@
2024-02-19T04:58:18.926796+0800 - INFO - 登陆成功
2024-02-19T05:00:45.136661+0800 - INFO - 登陆成功
2024-02-19T05:12:21.817077+0800 - INFO - 此时菜单点击的为:文档解读
2024-02-19T11:11:47.462293+0800 - INFO - 点击选择了50%
2024-02-19T18:04:49.471174+0800 - INFO - 发生报错:报错信息为'WebElement' object has no attribute 'get_element'
2024-02-19T18:10:18.397061+0800 - INFO - 发生报错:报错信息为'WebElement' object has no attribute 'get_element'
2024-02-19T18:15:01.900058+0800 - INFO - 发生报错:报错信息为'WebElement' object has no attribute 'getAttribute'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment