diff --git a/case/base_case.py b/case/base_case.py index acd95f490078c3bc0dafde5e8446066daba40e73..0e4510e98b474fa71c043f54abd1d4ed2a36b949 100644 --- a/case/base_case.py +++ b/case/base_case.py @@ -6,6 +6,6 @@ """ from apps.dde_autotest_euler.method.assert_method import AssertMethod - -class BaseCase(AssertMethod): +from apps.dde_autotest_euler.module.dde_dock.dde_dock_assert import DdeDockAssert +class BaseCase(AssertMethod, DdeDockAssert): """用例基类""" diff --git a/case/test_dde_1893225.py b/case/test_dde_1893225.py new file mode 100644 index 0000000000000000000000000000000000000000..c163e0237247f59ea97c9d3e8596bafbd27b30f5 --- /dev/null +++ b/case/test_dde_1893225.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# _*_ coding:utf-8 _*_ +""" +@Time : 2025/6/13 +@Author : xianglongfei@uniontech.com +""" +import pytest + +from apps.dde_autotest_euler.case.base_case import BaseCase +from public.dde_dock_public_widget import DdeDockPublicWidget + + +class TestDdeCase(BaseCase): + def test_dde_1893225(self): + """【任务栏】【菜单】设置模式_切换""" + dock = DdeDockPublicWidget() + #【步骤】:1.鼠标在任务栏右键菜单点击:模式 -> 时尚模式 + dock.click_right_submenu_dock_mode_fashion() + #【断言】:1.当前任务栏模式 -> 时尚模式 + self.assert_dock_mode(0) + + #【步骤】:1.鼠标在任务栏右键菜单点击:模式 -> 高效模式 + dock.click_right_submenu_dock_mode_efficient() + #【断言】:1.当前任务栏模式 -> 高效模式 + self.assert_dock_mode(1) + + + @pytest.fixture(scope="function", autouse=True) + def setup_teardown_1893225(self): + """前置和后置""" + yield + dock = DdeDockPublicWidget() + dock.click_right_submenu_dock_mode_efficient() + self.assert_dock_mode(1) diff --git a/dde.csv b/dde.csv index a9598c7fe2b0006eb41a95293c4cd252eb8878e2..abd7dad7c25a16881f2b3226cd8b0924f1f8020f 100644 --- a/dde.csv +++ b/dde.csv @@ -76,3 +76,4 @@ 1893165,,, 1271215,,, 1893167,,, +1893225,,, diff --git a/module/__init__.py b/module/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/module/dde_control_center/__init__.py b/module/dde_control_center/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/module/dde_dock/__init__.py b/module/dde_dock/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/module/dde_dock/dde_dock_assert.py b/module/dde_dock/dde_dock_assert.py new file mode 100644 index 0000000000000000000000000000000000000000..9e85a5b5f84698f0486c940a01aeff90d31d5478 --- /dev/null +++ b/module/dde_dock/dde_dock_assert.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 +# _*_ coding:utf-8 _*_ +""" +@Time : 2025/6/12 +@Author : xianglongfei@uniontech.com +@Desc : 任务栏断言库 +""" + +import os +import logging +from time import sleep +from src import Src +from src.assert_common import AssertCommon +from apps.dde_autotest_euler.module.dde_dock.dde_dock_dbus import DockDbus + + +class DdeDockAssert(AssertCommon): + """任务栏断言库""" + @staticmethod + def assert_dock_mode(mode): + """断言任务栏模式""" + mode_conf = { + "efficient": int(1), + "fashion": int(0) + } + if mode_conf['efficient'] == mode: + mode_text = "高效模式" + elif mode_conf['fashion'] == mode: + mode_text = "时尚模式" + else: + raise AssertionError(f"任务栏模式参数<{mode}>未知!") + logging.info("断言任务栏模式是否: %s", mode_text) + dock_mode = DockDbus.get_display_mode() + AssertCommon.assert_true(dock_mode == mode) + + @staticmethod + def assert_dock_location(location): + """断言任务栏位置""" + location_conf = { + "up": int(0), + "right": int(1), + "down": int(2), + "left": int(3) + } + if location_conf['up'] == location: + location_text = "上" + elif location_conf['right'] == location: + location_text = "右" + elif location_conf['down'] == location: + location_text = "下" + elif location_conf['left'] == location: + location_text = "左" + else: + raise AssertionError(f"任务栏位置参数<{location}>未知!") + logging.info("断言任务栏位置是否: %s", location_text) + dock_location = DockDbus.get_position() + AssertCommon.assert_true(dock_location == location) diff --git a/module/dde_dock/dde_dock_dbus.py b/module/dde_dock/dde_dock_dbus.py new file mode 100644 index 0000000000000000000000000000000000000000..cc6d60d8684c3817f258b6eef6f6ff8b5f1e5127 --- /dev/null +++ b/module/dde_dock/dde_dock_dbus.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +@Time : 2025/6/12 +@Author : xianglongfei@uniontech.com +@Desc : 任务栏dbus接口 +""" +import json +import dbus +from src import DbusUtils +from src import CmdCtl + + +class DockDbus: + """任务栏接口属性""" + DBUS_NAME = "com.deepin.dde.daemon.Dock" + OBJECT_PATH = "/com/deepin/dde/daemon/Dock" + INTERFACE = "com.deepin.dde.daemon.Dock" + + @classmethod + def dock_dbus_object(cls): + """初始化DockDbus,并继承DbusUtils类基础方法""" + return DbusUtils( + DockDbus.DBUS_NAME, DockDbus.OBJECT_PATH, DockDbus.INTERFACE + ) + + @staticmethod + def _dbus_string_format(dbus_array): + """格式化dbus.Array | dbus.String返回值 + :Param dbus_Array: dbus原始数据列表 + :Return: desktop_files格式化后的数据列表 + """ + desktop_files = [] + for i in range(len(dbus_array)): + desktop_file = dbus_array[i].split(',')[0] + desktop_files.append(desktop_file) + return list(desktop_files) + + @classmethod + def get_plugin_settings(cls, name, value): + """获取插件在任务栏是否设置 + :Param name: 插件名称 + AiAssistant (桌面智能助手) + datetime (时间) + multitasking (多任务视图) + notifications(通知中心) + onboard(屏幕键盘 + show-desktop (显示桌面) + shutdown (电源) + trash (回收站) + tray (托盘区域) + :Param value: 属性 + enable (可用) + Use24HourFormat (24小时制) ---对应datetime使用 + fashion-tray-expanded (托盘区域展开) ---对应tray使用 + :Return: True 或 False + """ + try: + json_v = cls.dock_dbus_object().session_object_methods().GetPluginSettings() + b_v = json.loads(json_v).get(name).get(value) + if b_v is None: + b_v = True + return bool(b_v) + except (AttributeError, ValueError, TypeError): + raise Exception("key:%s 或 value:%s 没有发现" % (name, value)) + + @classmethod + def is_docked(cls, desktop): + """图标是否驻留在dock上 + :Param desktop: desktop文件名,不带后缀名 + :Return: True 或 False + """ + desktop = f"/usr/share/applications/{desktop}.desktop" + b_v = cls.dock_dbus_object().session_object_methods().IsDocked(desktop) + return bool(b_v) + + @classmethod + def is_on_dock(cls, desktop): + """图标是否显示在dock上 + :Param desktop: desktop文件名,不带后缀名 + :Return: True 或 False + """ + desktop = f"/usr/share/applications/{desktop}.desktop" + b_v = cls.dock_dbus_object().session_object_methods().IsOnDock(desktop) + return bool(b_v) + + @classmethod + def request_dock(cls, desktop, index): + """图标发送到dock上,index是位置,从0开始,对应dock位置是1 + :Param desktop: desktop文件名,不带后缀名 + :Param index: dock中间区域的位置(从0开始,对应位置为1) + :Return: True 或 False + """ + desktop = f"/usr/share/applications/{desktop}.desktop" + b_v = cls.dock_dbus_object().session_object_methods().RequestDock(desktop, int(index)) + return bool(b_v) + + @classmethod + def request_undock(cls, desktop): + """图标从dock移除 + :Param desktop: desktop文件名,不带后缀名 + :Return: True 或 False + """ + desktop = f"/usr/share/applications/{desktop}.desktop" + b_v = cls.dock_dbus_object().session_object_methods().RequestUndock(desktop) + return bool(b_v) + + @classmethod + def get_docked_apps_desktop_files(cls): + """获取dock上应用的Desktop文件位置列表 + :Return: Desktop文件位置列表 + 如:'/usr/share/applications/google-chrome.desktop' + """ + l_v = cls.dock_dbus_object().session_object_methods().GetDockedAppsDesktopFiles() + l_v = cls._dbus_string_format(l_v) + return list(l_v) + + @classmethod + def get_dock_app_index(cls, app_name): + """获取dock上应用驻留的索引index, 从0开始,对应dock位置是1 + :Param app_name: desktop文件名,不带后缀名 + :Return: 应用驻留在任务栏的索引index + """ + app_list = cls.dock_dbus_object().session_object_methods().GetDockedAppsDesktopFiles() + desktop_file = '/usr/share/applications/' + app_name + '.desktop' + try: + return app_list.index(desktop_file) + except ValueError: + raise Exception(f"{app_name}:任务栏未驻留") + + @classmethod + def get_entry_ids(cls): + """获取dock上应用名称列表 + :Return: AppID列表(Desktop文件列表),不带后缀名 + 如:'google-chrome' + """ + l_v = cls.dock_dbus_object().session_object_methods().GetEntryIDs() + l_v = cls._dbus_string_format(l_v) + return list(l_v) + + @classmethod + def get_frontend_window_rect(cls): + """获取当前dock坐标范围大小 (x,y,width,height) + :Return: 坐标范围大小(x,y,width,height) + 如:(10,1030,1900,40) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('FrontendWindowRect') + return list(s_v) + + @classmethod + def get_display_mode(cls): + """获取dock当前模式设置:1高效,0时尚 + :Return: dock当前模式(1高效,0时尚) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('DisplayMode') + return int(s_v) + + @classmethod + def get_hide_mode(cls): + """获取dock当前状态设置:0一直显示,1一直隐藏,3智能隐藏 + :Return: dock当前状态设置(0一直显示,1一直隐藏,3智能隐藏) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('HideMode') + return int(s_v) + + @classmethod + def get_hide_state(cls): + """获取dock当前显示状态:1显示,2隐藏 + :Return: dock当前显示状态(1显示,2隐藏) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('HideState') + return int(s_v) + + @classmethod + def get_position(cls): + """获取dock当前位置设置:0上,1右,2下,3左 + :Return: dock当前位置(0上,1右,2下,3左) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('Position') + return int(s_v) + + @classmethod + def get_window_size_efficient(cls): + """获取高效模式dock当前大小 + :Return: 高效模式dock当前大小(如:40) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('WindowSizeEfficient') + return int(s_v) + + @classmethod + def set_window_size_efficient(cls, efficient_size): + """设置高效模式dock大小 + :Param efficient_size: 高效模式dock大小 + :Return: None + """ + cls.dock_dbus_object().set_session_properties_value( + 'WindowSizeEfficient', dbus.UInt32(efficient_size)) + + @classmethod + def get_window_size_fashion(cls): + """获取时尚模式dock当前大小 + :Return: 时尚模式dock当前大小(如:40) + """ + s_v = cls.dock_dbus_object().get_session_properties_value('WindowSizeFashion') + return int(s_v) + + @classmethod + def set_window_size_fashion(cls, fashion_size): + """设置时尚模式dock大小 + :Param fashion_size: 时尚模式dock大小 + :Return: None + """ + cls.dock_dbus_object().set_session_properties_value( + 'WindowSizeFashion', dbus.UInt32(fashion_size)) diff --git a/module/dde_launcher/__init__.py b/module/dde_launcher/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391