基础对象操作API介绍
在上一篇中我们了解了CukeTest中的容器类和控件基类,接下来就是针对各种不同的控件类的API介绍了。本篇文章中将介绍以下几个基础的控件类:
- 按钮控件: Button
- 窗口控件: Window
- 输入框控件: Edit/Document/Text/Spinner
- 单选按钮控件: RadioButton
- 复选框控件: CheckBox
- 组合框: ComboBox
- 选值框: Spinner
- 滚动条控件: ScrollBar
- 图片: Image
- 超链接: Hyperlink
- 滑动条控件: Slider
- 菜单相关的控件和菜单栏选项控件: MenuBar & Menu & MenuItem
- 标签栏控件和标签页控件: Tab & TabItem
由于各个控件类因为是继承自IWintControl,因此每个控件类都拥有通用控件的所有操作和属性方法。以CheckBox
控件类举例:
CheckBox
控件有一个操作方法——toggleCheck()
用于设置勾选状态; 一个属性方法checkState()
用于判断CheckBox的勾选状态。true
表示勾选,false
代表未勾选,indeterminate
代表中间状态:
export interface IWinCheckBox extends IWintControl {
toggleCheck(checkState: boolean | 'indeterminate'): Promise<void>
checkState(): Promise<boolean | 'indeterminate'>
}
class WinCheckBox(WinControl):
def check(checked: bool) -> None
def checkState() -> Union[bool, str]
def toggleCheck(checkState: Union[bool, str]) -> None
CheckBox
除了这两个方法,还从IWintControl
基类继承了所有的方法,所以CheckBox
的方法实际上应该包含了基类的方法:
export interface IWinCheckBox extends IWintControl {
// CheckBox的操作方法
toggleCheck(checkState: boolean): Promise<void>
// 继承自基类的操作方法
click(x?: number, y?: number, mousekey?: MouseKey): Promise<void>;
dblClick(x?: number, y?: number, mousekey?: MouseKey): Promise<void>;
moveMouse(x?: number, y?: number, seconds?: number): Promise<void>
wheel(value: number): Promise<void>;
exists(time?: number): Promise<boolean>;
hScroll(value: number | ScrollAmount): Promise<void>;
vScroll(value: number | ScrollAmount): Promise<void>;
property(propertyIds: PropertyIds | string): Promise<string | boolean | number | Rect>;
checkImage(options?: CompareOptions): Promise<void>;
checkProperty(propertyName: string, expectedValue: string | number | boolean | RegExp, message: string): Promise<void>;
checkProperty(propertyName: string, expectedValue: string | number | boolean | RegExp, options: {message: string, operation: any}): Promise<void>;
waitProperty(propertyIds: PropertyIds, value: string, timeoutSeconds?: number/* default value 5 seconds */): Promise<boolean>;
drop(x?: number, y?: number, seconds?: number): Promise<void>;
drag(x?: number, y?: number): Promise<void>;
pressKeys(keys: string, opt?: PressKeysOptions | number): Promise<void>;
takeScreenshot(filePath?: string): Promise<void | string>;
highlight(duration?: number);
firstChild(controlType?: ControlType): Promise<IWinControl>;
lastChild(controlType?: ControlType): Promise<IWinControl>;
next(controlType?: ControlType): Promise<IWinControl>;
previous(controlType?: ControlType): Promise<IWinControl>;
parent(): Promise<IWinControl>;
all(): Promise<IWinControl[]>;
findControls(...conditions: ConditionFilter[]): Promise<IWinControl[]>; //used to be getControls
modelImage(options?: {encoding: 'buffer' | 'base64'}): Promise<string | Buffer>; //base64 is the default
modelProperties(all?: boolean): {[x: string]: any};
allProperties(): Promise<object>;
doDefaultAction(): Promise<void>;
rawText(): Promise<string>
// CheckBox的属性
checkState(): Promise<boolean>
// 继承自基类的属性方法
type(): Promise<string>;
text(): Promise<string>;
name(): Promise<string>;
hwnd(): Promise<number>;
x(): Promise<number>;
y(): Promise<number>;
height(): Promise<number>;
width(): Promise<number>;
enabled(): Promise<boolean>;
focused(): Promise<boolean>;
helpText(): Promise<string>;
labeledText(): Promise<string>;
value(): Promise<string | number>;
processId(): Promise<number>;
rect(): Promise<Rect>;
visible(): Promise<boolean>;
}
IWintControl
和IWintContainer
中的操作和属性方法而没有自己特有的,比如Button控件。
基础控件类介绍
按钮控件: Button
针对普通的按钮控件,模型管理器提供了Button
对象类型。
export interface IWinButton extends IWintControl {
}
class WinButton(WinControl):
...
由于
Button
控件的操作和属性方法与基类IWintControl
的一致,没有自己特有的方法,因此为空。它的操作方法可以参考基类方法介绍。
窗口控件: Window
针对应用窗口控件,模型管理器提供了Window
对象类型。
export interface IWinWindow extends IWintControl {
activate(): Promise<void>;
close(): Promise<void>;
maximize(): Promise<void>;
minimize(): Promise<void>;
restore(): Promise<void>;
isModal(): Promise<boolean>;
interactionState(): Promise<string>;
visualState(): Promise<string>;
}
class WinWindow(WinControl):
def activate() -> None
def close() -> None
def maximize() -> None
def minimize() -> None
def restore() -> None
def isModal() -> bool
def interactionState() -> str
def visualState() -> str
activate(): Promise<void>
激活目标窗口,使目标窗口出现在桌面最上层,避免被其它窗口遮盖。
- 返回值: 不返回任何值的异步方法。
close(): Promise<void>
关闭目标窗口。
- 返回值: 不返回任何值的异步方法。
maximize(): Promise<void>
最大化目标窗口。
- 返回值: 不返回任何值的异步方法。
minimize(): Promise<void>
最小化目标窗口。
- 返回值: 不返回任何值的异步方法。
restore(): Promise<void>
恢复目标窗口。当目标最小化以后可以使用这个方法恢复为正常状态。
- 返回值: 不返回任何值的异步方法。
isModal(): Promise<boolean>
获取指定窗口是否为模态窗口的值。isModal返回false不一定代表窗口不是模态窗口,推荐使用interactionState来判断。
- 返回值:
Boolean
类型,它会返回一个布尔值(true 或 false),表示窗口是否为模态窗口。如果返回值为 true,则表示该窗口是一个模态窗口;如果返回值为 false,则表示该窗口可能不是一个模态窗口。
interactionState(): Promise<string>
表示窗口的交互状态。
- 返回值:
string
类型,返回值可以是这些:Running
:窗口正在运行。这并不保证窗口已经准备好进行用户交互或正在响应。ReadyForUserInteraction
:窗口已经准备好进行用户交互。BlockedByModalWindow
:窗口被模态窗口阻塞。Closing
:窗口正在关闭。NotResponding
:窗口没有响应。
visualState(): Promise<string>
表示当前窗口的状态
- 返回值:
string
类型,Minimized
,Maximized
或Normal
。
在Windows环境中打开记事本,菜单栏点击【文件】选择【打开】来打开文件资源管理器窗口:
let isModal
let interactionState
let visualState
isModal = await modelWin.getWindow("文件资源管理器").isModal()
console.log(isModal) // 返回true
interactionState = await modelWin.getWindow("文件资源管理器").interactionState()
console.log(interactionState) //返回 ReadyForUserInteraction
interactionState = await modelWin.getWindow("记事本").interactionState()
console.log(interactionState) //返回 BlockedByModalWindow
visualState = await modelWin.getWindow("文件资源管理器").visualState()
console.log(visualState) //返回 Normal
isModal = modelWin.getWindow("文件资源管理器").isModal()
print(isModal) # 返回True
interactionState = modelWin.getWindow("文件资源管理器").interactionState()
print(interactionState) # 返回 ReadyForUserInteraction
interactionState = modelWin.getWindow("记事本").interactionState()
print(interactionState) # 返回 BlockedByModalWindow
visualState = modelWin.getWindow("文件资源管理器").visualState()
print(visualState) # 返回 Normal
输入框控件: Edit与Document
针对用于接收用户输入的输入框控件Edit
,而多行输入框有时为Document
。提供的操作方法和属性方法都是针对输入框中的值。
export interface IWinEdit extends IWintControl {
set(value: string): Promise<void>;
clearAll(): Promise<void>;
readOnly(): Promise<boolean>;
}
export interface IWinDocument extends IWinControl {
set(value: string): Promise<void>;
clearAll(): Promise<void>;
readOnly(): Promise<boolean>;
}
class WinEdit(WinControl):
def set(value: str) -> None
def clearAll() -> None
def readOnly() -> bool
class WinDocument(WinControl):
def set(value: str) -> None
def clearAll() -> None
def readOnly() -> bool
Text
和容器控件Pane
在一些情况下也是可编辑的,因此也提供了set
方法,用法与Edit
、Document
一致。
export interface IWinText extends IWinControl {
set(value: string): Promise<void>;
}
export interface IWinPane extends IWinControl {
set(value: string): Promise<void>;
}
class WinText(WinControl):
def set(value: str) -> None
class WinPane(WinControl):
def set(value: str) -> None
set(value): Promise<void>
设置输入框中的值。将目标输入框中的值替换为传入的字符串。
- value:
String
类型,期望写入到输入框的值; - 返回值: 不返回任何值的异步方法。
clearAll(): Promise<void>
清除输入框中的值。
- 返回值: 不返回任何值的异步方法。
readOnly(): Promise<boolean>
当前输入框是否为只读。只读返回true
,可读写返回false
。
- 返回值:
Promise<boolean>
类型,需要使用await
关键字取出其中的结果。
单选按钮控件: RadioButton
针对单选按钮的RadioButton
控件,按照使用逻辑提供了选中和获取选中状态的方法。
export interface IWinRadioButton extends IWintControl {
check(): Promise<void>;
checked(): Promise<boolean>;
}
class WinRadioButton(WinControl):
def checked() -> Union[bool, str]
def check() -> None
check(): Promise<void>
选中目标单选按钮。
- 返回值: 不返回任何值的异步方法。
checked(): Promise<boolean>
获取目标单选按钮的选中状态,true
代表已选中,false
代表未选中。
- 返回值:
Promise<boolean>
类型,代表目标复选框是否选中。需要使用await
关键字取出其中的结果。
复选框控件: CheckBox
针对复选框控件的CheckBox
控件,能够直接设定选中状态,当然也可以获取状态。
export interface IWinCheckBox extends IWintControl {
toggleCheck(checkState: boolean | 'indeterminate'): Promise<void>
checkState(): Promise<boolean | 'indeterminate'>
}
class WinCheckBox():
def check(checked: bool) -> None
def checkState() -> Union[bool, str]
def toggleCheck(checkState: Union[bool, str]) -> None
checkState
是为了Windows复选框创建的类,支持的值有true|false|'indeterminate'
三种,true
代表选中复选框,false
代表取消选中目标复选框。'indeterminate'
代表中间值。因为Windows复选框有时候存在三种状态,无法直接用布尔型boolean
表示。
toggleCheck(checkState): Promise<void>
设置目标复选框的选中状态。
- checkState:
checkState
类型。 - 返回值: 不返回任何值的异步方法。
checked(): Promise<checkState>
获取目标单选按钮的选中状态。
- 返回值:
Promise<checkState>
类型。
组合/下拉框: ComboBox
针对带下拉框的一类特殊输入框的ComboBox
控件,提供了选择指定下拉选项的操作方法。
export interface IWinComboBox extends IWintControl {
open(): Promise<void>;
select(nameOrIndex: String | number): Promise<void>;
options(index: number): Promise<string | string[]>;
itemCount(): Promise<number>;
selectedName(): Promise<string>;
}
class WinComboBox(WinControl):
def options(index: Optional[int]=None) -> Union[str, List[str]]
def itemCount() -> int
def selectedName() -> str
def select(value: Union[str, int]) -> None
def open() -> None
open(): Promise<void>
展开下拉框,可以视作触发了目标右侧的▼
按钮。
- 返回值: 不返回任何值的异步方法。
select(nameOrIndex): Promise<void>
- nameOrIndex:
number
或String
类型。如果为数字,则会选中下拉框中相应索引位置的选项;如果为字符串,则会选择下拉框中相应名称的选项。 - 返回值: 不返回任何值的异步方法。
selectedName(): Promise<string>
获取当前选中的值。
- 返回值:
Promise<string>
类型,代表当前选中的值。需要使用await
关键字取出其中的结果。
options(): Promise<string[]>
获取目标组合框中所有可选选项的名称。
- 返回值:
Promise<string[]>
类型,即字符串数组,获取目标组合框中所有可选选项的名称。需要使用await
关键字取出其中的结果。
itemCount(): Promise<number>
获取目标组合框中所有可选选项的数量。可以理解为options()
方法返回数组的长度。
返回值: Promise<number>
类型,异步的返回选项数量。
选值框: Spinner
针对应用中带上下箭头的选值框Spinner
控件,提供了与输入框Edit
控件类似的输入、编辑和清空的方法。并另外提供了单步增加/减少值的操作API。
该控件的类型定义如下:
export interface IWinSpinner extends IWinEdit {
set(value: string): Promise<void>;
clearAll(): Promise<void>;
readOnly(): Promise<boolean>;
increment(): Promise<void>;
decrement(): Promise<void>;
}
class WinSpinner(WinControl):
def set(value: str) -> None
def clearAll() -> None
def readOnly() -> bool
def increment() -> None
def decrement() -> None
set(value): Promise<void>
见set()方法。如果输入字符串会失效,因为控件只接受数值参数。
也可以使用pressKeys()
方法完成输入。
clearAll(): Promise<void>
readOnly(): Promise<boolean>
increment(): Promise<void>
使取值框的值增加一个单位,单位大小取决于应用中的设置。可以理解为触发了一次取值框中的上箭头。
- 返回值: 不返回任何值的异步方法。
decrement(): Promise<void>
使取值框的值减少一个单位,单位大小取决于应用中的设置。可以理解为触发了一次取值框中的下箭头。
- 返回值: 不返回任何值的异步方法。
滑动条: Slider
用于滑动调整数值的滑动条控件。
export interface WinSlider extends WinControl {
setPosition(value: number): Promise<void>;
position(): Promise<number>;
maximum(): Promise<number>;
minimum(): Promise<number>;
readOnly(): Promise<boolean>;
}
setPosition(value): Promise<void>
调整滑动条的值。无法超出最大值。
- value:
number
类型,滑动条的值。 - 返回值: 不返回任何值的异步方法。
position(): Promise<number>
获取滑动条的值。
- 返回值:
number
类型,滑动条的值。
maximum(): Promise<number>
获取滑动条的最大值。
- 返回值:
number
类型,滑动条的最大值。
minimum(): Promise<number>
获取滑动条的最小值。
- 返回值:
number
类型,滑动条的最小值。
readOnly(): Promise<boolean>
滑动条是否可调整。
- 返回值:
boolean
类型,是否可调整。
滚动条控件: ScrollBar
针对操作滚动区域中的滚动条控件,但需要滚动操作时,识别到该区域的滚动条控件,再通过调用滚动条上的方法来完成区域的滚动操作是一种非常方便的选择。
滚动条控件实际上是一种特殊的滑动条。
类型文件如下:
export interface IWinScrollBar extends IWinControl {
setValue(value: number): void;
isTop(): Promise<boolean>;
isBottom(): Promise<boolean>;
lineUp(): Promise<void>;
lineDown(): Promise<void>;
pageUp(): Promise<void>;
pageDown(): Promise<void>;
scrollToTop(): Promise<void>;
scrollToBottom(): Promise<void>;
}
class WinScrollBar(WinControl):
def setValue(value: int) -> None
def isTop() -> bool
def isBottom() -> bool
def lineUp() -> None
def lineDown() -> None
def pageUp() -> None
def pageDown() -> None
def scrollToTop() -> None
def scrollToBottom() -> None
setValue(value: number): Promise<void>
设置滚动条的值,将滑块拖拽至指定值的位置,但不会超出最大值。单位可以理解为滚轮格数。
- value:
number
类型,将滑块拖拽至指定值的位置; - 返回值: 不返回任何值的异步方法。
lineUp(): Promise<void>
向上/左滚动一个单位,单位可以当作滚轮格数,也就是按下一次上/左方向键滚动的量。
- 返回值: 不返回任何值的异步方法。
lineDown(): Promise<void>
向下/右滚动一个单位,单位可以当作滚轮格数,也就是按下一次下/右方向键滚动的量。
- 返回值: 不返回任何值的异步方法。
pageUp(): Promise<void>
向上/左滚动一页,也就是按下一次PageUp
键滚动的量。
- 返回值: 不返回任何值的异步方法。
pageDown(): Promise<void>
向下/右滚动一页,也就是按下一次PageDown
键滚动的量。
- 返回值: 不返回任何值的异步方法。
scrollToTop(): Promise<void>
将滚动条滚动到顶部。
- 返回值: 不返回任何值的异步方法。
scrollToBottom(): Promise<void>
将滚动条滚动到底部。
- 返回值: 不返回任何值的异步方法。
isTop(): Promise<boolean>
滚动条是否处在顶部。
- 返回值:
boolean
类型,滚动条是否处在顶部。
isBottom(): Promise<boolean>
滚动条是否处在底部。
- 返回值:
boolean
类型,滚动条是否处在底部。
图片控件: Image
图片控件。
export interface IWinImage extends IWintControl {
visualText(): Promise<string>;
}
visualText(): Promise<string>
使用OCR识别图片中的文本。
- 返回值:
string
类型,图片控件中的文本内容。
超链接控件: Link/HyperLink
超链接控件。
export interface IWinLink extends IWintControl {
url(): Promise<string>;
}
export interface IWinHyperlink extends IWinLink {
}
url(): Promise<string>
获取超链接指向的地址。
- 返回值:
string
类型,链接的地址。
菜单相关的控件和菜单栏选项控件: MenuBar & Menu & MenuItem
针对应用中的菜单操作相关的有MenuBar
、Menu
和MenuItem
三种控件。其中前两个控件都属于容器控件(菜单栏容器与展开菜单容器),实际可以点击的选项都是MenuItem
控件。
export interface IWinMenuBar extends IWintControl {
itemNames(index:number) : Promise<string>;
open(itemNameOrIndex: string | number): Promise<void>;
//Get the menu item count
itemCount(): Promise<number>;
}
export interface IWinMenu extends IWintControl {
select(menuPath: string): Promise<boolean>;
itemCount(menuPath:string): Promise<number>;
itemName(menuPath:string): Promise<string>;
itemNames(): Promise<string[]>;
}
export interface IWinMenuItem extends IWintControl {
invoke(): Promise<void>;
open(): Promise<void>
}
class WinMenuBar(WinControl):
def itemNames(index: int) -> str
def open(itemNameOrndex: Union[str, int]) -> None
def itemCount() -> int
class WinMenu(WinControl):
def itemCount(menuPath: str) -> int
def itemName(menuPath: str) -> str
def itemNames() -> List[str]
def select(menuPath: str) -> bool
class WinMenuItem(WinControl):
def invoke() -> None
def open() -> None
itemNames(index) : Promise<string>
获取目标索引值的菜单项名称。
- index:
number
类型,目标菜单项的索引值。 - 返回值:
Promise<string>
类型,异步的返回目标索引值对应的菜单项名称。
open(itemNameOrIndex: string | number): Promise<void>
展开目标索引值的菜单项。
- index:
number
类型,目标菜单项的索引值;string
类型,目标菜单项的名称。 - 返回值: 不返回任何值的异步方法。
itemCount(): Promise<number>
获取菜单栏中菜单项总数。
- 返回值:
Promise<number>
类型,异步的返回菜单项数量。
菜单容器Menu的API介绍
itemCount(): Promise<number>
获取菜单容器中菜单项总数。
- 返回值:
Promise<number>
类型,异步的返回菜单项数量。
itemName(menuPath): Promise<string>
获取目标索引值的菜单项名称。
- menuPath:
number
类型,目标菜单项的索引值。 - 返回值:
Promise<string>
类型,异步的返回目标索引值对应的菜单项名称。
itemNames(): Promise<string[]>
获取所有菜单项的名称。
- 返回值:
Promise<string[]>
类型,异步的返回菜单中所有菜单项的名称。
select(menuPath: string): Promise<boolean>
选中目标索引值的菜单项。
- menuPath:
number
类型,目标菜单项的索引值。 - 返回值:
Promise<boolean>
类型,异步的返回目标是否成功选中了。
菜单项MenuItem的API介绍
open(): Promise<void>
展开菜单项所在的菜单容器。
- 返回值: 没有任何返回值的异步方法。
invoke(): Promise<void>
点击/触发菜单项。建议先使用open()
方法展开菜单,再进行点击。
- 返回值: 没有任何返回值的异步方法。
子菜单的点击方法:
对于一些需要悬停展开后才能点击到的子菜单项,可以先调用父菜单项上的.moveMouse()
通用方法将鼠标移动到该位置上,再点击子菜单。
这是因为两次点击之前的鼠标轨迹是不能确定的,部分控件的点击是不会移动鼠标的,此时如果需要鼠标光标出现在确定的位置,则最好使用.moveMouse()
来手动的移动光标。
标签栏控件和标签页控件: Tab & TabItem
针对应用中的标签页的控件,Tab
和TabItem
,进行标签页的切换。
关于标签栏控件的定义如下:
export interface IWinTab extends IWintControl {
activate(nameOrIndex: string | number): Promise<void>;
tabNames(index: number): Promise<string[] | string>;
findItem(nameOrIndex: string | number): Promise<IWinTabItem>;
activeName(): Promise<string>;
activeIndex(): Promise<number>;
count(): Promise<number>;
}
export interface IWinTabItem extends IWintControl {
activate(): Promise<void>;
text(): Promise<string>;
itemIndex(): Promise<number>;
}
class WinTab(WinControl):
def activate(nameOrndex: Union[str, int]) -> None
def tabNames(index: Optional[int]=None) -> Union[str, List[str]]
def findItem(nameOrndex: Union[str, int]) -> "WinTabItem"
def select(item: Union[str, int]) -> None
def activeName() -> str
def activendex() -> int
def count() -> int
class WinTabItem(WinControl):
def activate() -> None
def text() -> str
def itemndex() -> int
findItem(itemNameOrIndex): IWinTabItem
获取指定标签页的自动化对象,传入标签页的索引值或标题。
- itemNameOrIndex:
number
或string
类型,目标标签页的索引值或标签页标题。 - 返回值:
TabItem
类型,同步的返回一个TabItem
类型的操作对象。
activate(itemNameOrIndex): Promise<void>
激活目标标签页,传入标签页的索引值或标题。
如果是
TabItem
上的activate()
方法则不需要传入任何参数。
- itemNameOrIndex:
number
或string
类型,目标标签页的索引值或标签页标题。- 返回值: 不返回任何值的异步方法。
activateIndex(): Promise<number>
获取当前界面中被激活的标签索引值。
- 返回值:
number
类型,标签页索引值。
activateName(): Promise<string>
获取当前界面中被激活的标签名称。
- 返回值:
string
类型,标签页的名称。
tabNames(index): Promise<string[] | string>
获取所有标签页的标题,如果传入数字,则获取对应索引值的标签页标题。
- index:
number
类型,目标标签页的索引值,默认值为-1
,会获取全部标题。 - 返回值: 当
index
为-1
时,为string[]
,为所有标签页标题组成的字符串数组;当index
为其它值时,为string
,返回目标索引值对应的标签页标题。
count(): Promise<number>
获取标签栏中的标签页数量。
- 返回值:
number
类型,标签页的数量。
以下是TabItem
对象的方法。
activate(): Promise<void>
激活标签页。
- 返回值: 不返回任何值的异步方法。
text(): Promise<string>
重写自基类的text()
方法,获取标签页标题。
- 返回值:
string
类型,返回标签页的标题。
校验获取到的标签页标题
let title = await model.getTabItem("One").click();
assert.equal(title, 'One');
title = model.getTabItem("One").click()
assert title == 'One'
itemIndex(): Promise<number>
获取标签页在整个标签栏中的次序。
- 返回值:
number
类型,返回标签页的索引值。