获取对象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

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

    获取对象API - 图3

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

  2. 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有下面两种类型的参数:

  1. 对象名称,string类型,是模型库中的某个对象名称。
  2. 识别属性,Object类型,包含多个键/值对,这些属性通过”AND”条件集合后用于过滤对象。

调用方式有如下几种:

  1. 只提供对象名,如下:

    1. await model.getButton("五").click();
  2. 只提供识别属性 在描述式编程中,你可以从属性直接构造对象,而不用加载模型。

    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();

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

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

  3. 混合模式,即第一个参数是对象名,第二个参数是识别属性。对象名参数用于从模型中获取对象,第二个参数的识别属性用于覆盖对象上的识别属性,之后形成的属性集合再用来寻找对象。 例如,如果用下面的调用:

    1. await model.getButton("五", {"automationId": "num6Button"}).click();

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