• 获取对象API
    • parent
    • getControls
      • 1. 打开了多个应用实例,寻找其中的一个
        • 2. 有一组控件,进行集合操作
    • get[ControlType]

    获取对象API

    获取对象API是那些用于从模型中获取对象的API,或者在描述式编程中通过属性生成对象的API,有如下:

    1. export interface IWinContainer {
    2. parent: IWinContainer;
    3. getControls(...conditions: ConditionFilter[]): Promise<IWinControl[]>;
    4. getWindow(...conditions: ConditionFilter[]): IWinWindow;
    5. getButton(...conditions: ConditionFilter[]): IWinButton;
    6. getCheckBox(...conditions: ConditionFilter[]): IWinCheckBox;
    7. getComboBox(...conditions: ConditionFilter[]): IWinComboBox;
    8. getCustom(...conditions: ConditionFilter[]): IWinCustom;
    9. getDataItem(...conditions: ConditionFilter[]): IWinControl;
    10. getDataGrid(...conditions: ConditionFilter[]): IWinDataGrid
    11. getDocument(...conditions: ConditionFilter[]): IWinDocument;
    12. getEdit(...conditions: ConditionFilter[]): IWinEdit;
    13. getGeneric(...conditions: ConditionFilter[]): IWinGeneric;
    14. getImage(...conditions: ConditionFilter[]): IWinImage;
    15. getList(...conditions: ConditionFilter[]): IWinList;
    16. getListItem(...conditions: ConditionFilter[]): IWinListItem;
    17. getMenuBar(...conditions: ConditionFilter[]): IWinMenuBar;
    18. getMenuItem(...conditions: ConditionFilter[]): IWinMenuItem
    19. getMenu(...conditions: ConditionFilter[]): IWinMenu;
    20. getPane(...conditions: ConditionFilter[]): IWinPane;
    21. getRadioButton(...conditions: ConditionFilter[]): IWinRadioButton;
    22. getScrollBar(...conditions: ConditionFilter[]): IWinScrollBar;
    23. getSlider(...conditions: ConditionFilter[]): IWinSlider;
    24. getSpinner(...conditions: ConditionFilter[]): IWinSpinner;
    25. getTab(...conditions: ConditionFilter[]): IWinTab;
    26. getTabItem(...conditions: ConditionFilter[]): IWinTabItem;
    27. getTable(...conditions: ConditionFilter[]): IWinTable;
    28. getTree(...conditions: ConditionFilter[]): IWinTree;
    29. getTreeItem(...conditions: ConditionFilter[]): IWinTreeItem;
    30. getText(...conditions: ConditionFilter[]): IWinText;
    31. getVirtual(...conditions: ConditionFilter[]): IWinVirtual
    32. }

    其中:

    parent

    返回父容器对象。

    getControls

    返回容器对象数组。它能够根据传入的条件,实时获得应用上所有匹配的控件,并返回对象数组的Promise。该API可以用于有界面多个相似控件的时候,同时返回这一组对象,以便于对所有这些对应控件进行操作。

    getControls常用于以下场景:

    1. 打开了多个应用实例,寻找其中的一个

    例如,你打开了多个Notepad应用,每个在编辑不同的文件,你要找到其中的一个做后继的操作。可以在模型中添加Notepad窗体的对象,如下图:

    获取对象API - 图1

    注意我们已经把Title属性从标识属性中删除,以便匹配不同的对象。

    然后运行下面的Node.js代码

    1. (async function() {
    2. let controls = await model.getControls("Notepad");
    3. controls.map(async (control) => console.log(await control.name()));
    4. let firstNodePad = controls[0];
    5. await firstNodePad.activate()
    6. })()

    这段代码会获得所有的Notepad窗口,并打印他们的标题,并将第一个窗口激活显示在前面。

    2. 有一组控件,进行集合操作

    例如界面上有一组CheckBox控件,需要将它们都选中。以自带样例SimpleStyles为例:

    获取对象API - 图2

    • 为了将上面所有的checkbox都标记为选中,可以先加入如下的模型对象:

    获取对象API - 图3

    注意"Name"属性已经从标识属性中删除以匹配所有CheckBox对象。

    • getControls调用中使用该对象,
    1. (async function() {
    2. let controls = await model.getControls("Normal");
    3. console.log('controls', controls.length) //匹配控件数量
    4. for(let control of controls) {
    5. console.log(await control.name()); //打印checkbox名称
    6. await control.check(); //勾选checkbox控件
    7. }
    8. })()

    get[ControlType]

    其中,针对每个控件类型都提供了一个方法,该方法返回这种类型控件的测试对象。例如,Button控件可以通过getButton方法获得,List控件可以通过getList方法获得。

    这些API对象调用后返回的是另一个子容器对象,意味着可以对这些对象级联调用这些容器API,获得控件树更深层次的对象。

    conditions有下面两种类型的参数:

    • 对象名称,string类型,是模型库中的某个对象名称。
    • 识别属性,Object类型,包含多个键/值对,这些属性通过”AND”条件集合后用于过滤对象。调用方式有如下几种:

    • 只提供对象名,如下:

    1. await model.getButton("五").click();
    • 只提供识别属性在描述式编程中,你可以从属性直接构造对象,而不用加载模型。
    1. const { Auto } = require('leanpro.win');
    2. await Auto.getWindow({
    3. "className": "ApplicationFrameWindow",
    4. "title": "计算器 ‎- 计算器"
    5. }).getWindow({
    6. "className": "Windows.UI.Core.CoreWindow",
    7. "title": "计算器"
    8. }).getGeneric({
    9. "type": "Group",
    10. "automationId": "NumberPad",
    11. "name": "数字键盘"
    12. }).getButton({
    13. "automationId": "num5Button"
    14. }).click();

    上述例子中,每个调用都是传一个对象参数,这个对象包含了多个键/值对,组合在一起后形成过滤条件寻找对象。

    更多关于描述模式开发的内容请参见描述模式.

    • 混合模式,即第一个参数是对象名,第二个参数是识别属性。对象名参数用于从模型中获取对象,第二个参数的识别属性用于覆盖对象上的识别属性,之后形成的属性集合再用来寻找对象。例如,如果用下面的调用:
    1. await model.getButton("五", {"automationId": "num6Button"}).click();

    则点击的按钮是计算器上的”6”、而不是”5”,因为automationId已经被第二个参数覆盖成新的值。容器对象API是同步的,意味着调用时不需要使用await前缀。