UI面板基类(基于UGUI)

根据UI组件挂载的游戏物体名称来获取组件,将得到的所有组件根据名称存放到字典中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

/// <summary>
/// 面板基类 
/// 帮助我门通过代码快速的找到所有的子控件
/// 方便我们在子类中处理逻辑 
/// 节约找控件的工作量
/// </summary>
public class BasePanel : MonoBehaviour
{
    //通过里式转换原则 来存储所有的控件
    private Dictionary<string, List<UIBehaviour>> controlDic = new Dictionary<string, List<UIBehaviour>>();

	// Use this for initialization
	protected virtual void Awake () {
        FindChildrenControl<Button>();
        FindChildrenControl<Image>();
        FindChildrenControl<Text>();
        FindChildrenControl<Toggle>();
        FindChildrenControl<Slider>();
        FindChildrenControl<ScrollRect>();
        FindChildrenControl<InputField>();
    }
	
    /// <summary>
    /// 显示自己
    /// </summary>
    public virtual void ShowMe()
    {
        
    }

    /// <summary>
    /// 隐藏自己
    /// </summary>
    public virtual void HideMe()
    {

    }

    protected virtual void OnClick(string btnName)
    {

    }

    protected virtual void OnValueChanged(string toggleName, bool value)
    {

    }

    /// <summary>
    /// 得到对应名字的对应控件脚本
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="controlName"></param>
    /// <returns></returns>
    protected T GetControl<T>(string controlName) where T : UIBehaviour
    {
        if(controlDic.ContainsKey(controlName))
        {
            for( int i = 0; i <controlDic[controlName].Count; ++i )
            {
                if (controlDic[controlName][i] is T)
                    return controlDic[controlName][i] as T;
            }
        }

        return null;
    }

    /// <summary>
    /// 找到子对象的对应控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    private void FindChildrenControl<T>() where T:UIBehaviour
    {
        T[] controls = this.GetComponentsInChildren<T>();
        for (int i = 0; i < controls.Length; ++i)
        {
            string objName = controls[i].gameObject.name;
            if (controlDic.ContainsKey(objName))
                controlDic[objName].Add(controls[i]);
            else
                controlDic.Add(objName, new List<UIBehaviour>() { controls[i] });
            //如果是按钮控件
            if(controls[i] is Button)
            {
                (controls[i] as Button).onClick.AddListener(()=>
                {
                    OnClick(objName);
                });
            }
            //如果是单选框或者多选框
            else if(controls[i] is Toggle)
            {
                (controls[i] as Toggle).onValueChanged.AddListener((value) =>
                {
                    OnValueChanged(objName, value);
                });
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在pytest中编写UI测试的基类可以通过使用`pytest`提供的fixture和hook机制实现。下面是一个示例的UI测试基类的代码: ```python import pytest from selenium import webdriver # 定义UI测试的基类 @pytest.fixture(scope="class") def base_ui_test(request): # 在测试类开始时执行的操作 driver = webdriver.Chrome() # 实例化WebDriver,这里以Chrome为例 request.cls.driver = driver # 将WebDriver对象保存到测试类中 yield # 在测试类结束时执行的操作 driver.quit() # 定义一个UI测试的基类 @pytest.mark.usefixtures("base_ui_test") class BaseUITest: pass ``` 在上述代码中,我们使用了`pytest.fixture`装饰器定义了一个作用域为`class`的fixture函数`base_ui_test`。这个fixture函数将在每个测试类开始前执行一次,并在测试类结束后执行一次。 然后,我们使用`@pytest.mark.usefixtures`装饰器将定义好的fixture函数应用到我们的基类`BaseUITest`上。 接下来,你可以创建其他UI测试类,并继承自`BaseUITest`基类。这样,每个继承了`BaseUITest`的测试类都会自动拥有一个`driver`属性,可以在测试方法中使用该属性进行UI操作。 ```python class TestLoginPage(BaseUITest): def test_login_successful(self): # 使用self.driver进行页面操作和断言 pass def test_login_failed(self): # 使用self.driver进行页面操作和断言 pass ``` 通过这种方式,你可以在UI测试中共享`driver`对象,并在每个测试类开始前和结束后执行一些操作,例如启动和关闭浏览器。这样可以提高测试代码的可维护性和复用性。当然,你可以根据实际需求进行定制和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值