基本类型对象
在上一篇中我们了解了CukeTest中的容器类和控件基类,接下来就是针对各种不同的控件类的API介绍了。本篇文章中将介绍以下几个基础的控件类:
- 按钮控件: Button
- 窗口控件: Window
- 标签控件: Label
- 输入框控件: Edit
- 单选按钮控件: RadioButton
- 复选框控件: CheckBox
- 组合框: ComboBox
- 选值框: SpinBox
- 应用控件: Application
- 进度条控件: ProgressBar
- 旋钮控件: Dial
- 滑动条控件: Slider
- 滚动区域控件: ScrollArea
- 菜单栏控件和菜单栏选项控件: MenuBar & MenuBarItem
- 菜单控件和菜单选项控件: Menu & MenuItem
- 标签栏控件和标签页控件: Tab & TabItem
- Quick控件:QuickItem
- Qt WebEngine
而相对复杂的控件类有以下几个,由于包含的方法比较多,因此放到了其它文档中,请按照需求点击链接跳转:
- 列表类型对象: 介绍列表控件
List和列表项控件ListItem; - 树类型对象: 介绍树控件
Tree和树节点控件TreeItem; - 表格类型对象: 介绍表格控件
Table和单元格控件TableItem;
以及以上三个复杂控件的基类自定义视图ItemView控件,针对Qt应用中从AbstractView抽象视图派生出来的自定义组件,介绍如下:
- 自定义视图对象: 介绍自定义视图控件
ItemView和自定义项控件ItemViewItem;
由于各个控件类因为是继承自IQtControl,因此每个控件类都拥有通用控件的所有操作和属性方法。以CheckBox控件类举例:
CheckBox控件有一个操作方法——check()用于设置是勾选还是清除勾选; 一个属性方法checked()用于判断CheckBox的勾选状态。true表示勾选,false代表未勾选:
export interface IQCheckBox extends IQtControl {
toggleCheck(checkState: boolean): Promise<void>
checkState(): Promise<boolean>
}class QCheckBox(QtControl):
def checkState() -> bool
def toggleCheck(checkState: bool) -> NoneCheckBox除了这两个方法,还从IQtControl基类继承了所有的方法,所以CheckBox的方法实际上应该包含了基类的方法:
export interface IQCheckBox extends IQtControl {
toggleCheck(checkState: boolean): Promise<void>
checkState(): Promise<boolean>
// 来自IQtControl
click(x?: number, y?: number, mousekey?: number): Promise<void>;
dblClick(x?: number, y?: number, mousekey?: number): Promise<void>;
moveMouse(x?: number, y?: number): Promise<void>;
wheel(value: number): Promise<void>;
takeScreenshot():Promise<string>;
rect(): Promise<Rect>
}IQtControl和IQtContainer中的操作和属性方法而没有自己特有的,比如Button控件。
基础控件类介绍
按钮控件: Button
针对普通的按钮控件,模型管理器提供了Button对象类型。
| 方法名 | 描述 |
|---|---|
| text | 获取按钮上的内容。 |
export interface IQButton extends IQtControl {
text(): Promise<string>;
}class QButton(QtControl):
def text() -> strtext()
获取按钮上的内容。
返回值:
string类型,异步返回按钮上的文本内容。
使用示例
校验获取按钮上的内容,假设当前按钮控件为Button。
// 获取按钮文本并验证
let text = await model.getButton("Button").text();
assert.equal(text, 'Button');# 获取按钮文本并验证
text = model.getButton("Button").text()
assert text == 'Button'窗口控件: Window
针对应用窗口控件,模型管理器提供了Window对象类型。
| 方法名 | 描述 |
|---|---|
| activate | 激活目标窗口,使目标窗口出现在桌面最上层。 |
| close | 关闭目标窗口。 |
| maximize | 最大化目标窗口。 |
| minimize | 最小化目标窗口。 |
| restore | 恢复目标窗口到正常状态。 |
export interface IQWindow extends IQtControl {
activate(): Promise<void>;
close(): Promise<void>;
maximize(): Promise<void>;
minimize(): Promise<void>;
restore(): Promise<void>;
}class QWindow(QtControl):
def activate() -> None
def close() -> None
def maximize() -> None
def minimize() -> None
def restore() -> Noneactivate()
激活目标窗口,使目标窗口出现在桌面最上层,避免被其它窗口遮盖。
返回值:
- 不返回任何值的异步方法。
使用示例
// 激活Qt应用窗口
await model.getWindow("MainWindow").activate();# 激活Qt应用窗口
model.getWindow("MainWindow").activate()由于CukeTest与Qt的桌面操作自动化是通过通信实现的,因此自动化操作不会因为Qt窗口被遮住而失效。
close()
关闭目标窗口。
返回值:
- 不返回任何值的异步方法。
使用示例
// 关闭Qt应用窗口
await model.getWindow("MainWindow").close();# 关闭Qt应用窗口
model.getWindow("MainWindow").close()maximize()
最大化目标窗口。
返回值:
- 不返回任何值的异步方法。
使用示例
// 最大化Qt应用窗口
await model.getWindow("MainWindow").maximize();# 最大化Qt应用窗口
model.getWindow("MainWindow").maximize()minimize()
最小化目标窗口。
返回值:
- 不返回任何值的异步方法。
使用示例
// 最小化Qt应用窗口
await model.getWindow("MainWindow").minimize();# 最小化Qt应用窗口
model.getWindow("MainWindow").minimize()restore()
恢复目标窗口。当目标最小化以后可以使用这个方法恢复为正常状态。
返回值:
- 不返回任何值的异步方法。
使用示例
// 先最小化窗口
await model.getWindow("MainWindow").minimize();
// 然后恢复窗口到正常状态
await model.getWindow("MainWindow").restore();# 先最小化窗口
model.getWindow("MainWindow").minimize()
# 然后恢复窗口到正常状态
model.getWindow("MainWindow").restore()标签控件: Label
针对用于标示其它控件或显示固定内容的标签控件Label,没有操作方法,只有一个自己的属性方法:
| 方法名 | 描述 |
|---|---|
| text | 获得标签当前的值。 |
export interface IQLabel extends IQtControl {
text(): Promise<string>
}class QLabel(QtControl):
def text() -> strtext()
获得标签当前的值。
返回值:
string类型,异步返回标签的文本内容。
使用示例
校验获取标签当前的值,假设当前标签控件为Line_1。
// 获取标签文本并验证
let text = await model.getLabel("Line_1:").text();
assert.equal(text, 'Line_1');# 获取标签文本并验证
text = model.getLabel("Line_1:").text()
assert text == 'Line_1'输入框控件: Edit
针对用于接收用户输入的输入框控件Edit,没有区分单行输入框与多行输入框。提供的操作方法和属性方法都是针对输入框中的值。
| 方法名 | 描述 |
|---|---|
| set | 设置输入框中的值。 |
| clearAll | 清除输入框中的值。 |
| value | 获取当前输入框中的值并返回。 |
export interface IQEdit extends IQtControl {
set(value: String): Promise<void>;
clearAll(): Promise<void>;
value(): Promise<string>;
}class QEdit(QtControl):
def value() -> str
def set(value: str) -> None
def clearAll() -> Noneset(value)
设置输入框中的值。将目标输入框中的值替换为传入的字符串。
参数:
- value:
string类型,期望写入到输入框的值。
返回值:
- 不返回任何值的异步方法。
使用示例
// 在输入框中输入文本
await model.getEdit("Edit").set("Hello World!");# 在输入框中输入文本
model.getEdit("Edit").set("Hello World!")clearAll()
清除输入框中的值。
返回值:
- 不返回任何值的异步方法。
使用示例
// 清空输入框内容
await model.getEdit("Edit").clearAll();# 清空输入框内容
model.getEdit("Edit").clearAll()value()
获取当前输入框中的值并返回。
返回值:
string类型,异步返回输入框中的文本内容。
使用示例
校验获取输入框中的值,假设当前输入框控件为Edit。
// 获取输入框内容并验证
let actual = await model.getEdit("Edit").value();
let expected = 'Hello World!';
assert.equal(actual, expected);# 获取输入框内容并验证
actual = model.getEdit("Edit").value()
expected = 'Hello World!'
assert actual == expected单选按钮控件: RadioButton
针对单选按钮的RadioButton控件,按照使用逻辑提供了选中和获取选中状态的方法。
| 方法名 | 描述 |
|---|---|
| check | 选中目标单选按钮。 |
| checked | 获取目标单选按钮的选中状态。 |
export interface IQRadioButton extends IQtControl {
check(): Promise<void>;
checked(): Promise<boolean>;
}class QRadioButton(QtControl):
def check() -> None
def checked() -> boolcheck()
选中目标单选按钮。
返回值:
- 不返回任何值的异步方法。
使用示例
// 选中单选按钮
await model.getRadioButton("男").check();# 选中单选按钮
model.getRadioButton("男").check()checked()
获取目标单选按钮的选中状态,true代表已选中,false代表未选中。
返回值:
boolean类型,异步返回目标单选按钮是否选中。
使用示例
// 检查单选按钮是否被选中
let isChecked = await model.getRadioButton("男").checked();
console.log(`单选按钮是否选中: ${isChecked}`);# 检查单选按钮是否被选中
is_checked = model.getRadioButton("男").checked()
print(f"单选按钮是否选中: {is_checked}")复选框控件: CheckBox
针对复选框控件的CheckBox控件,能够直接设定选中状态,当然也可以获取状态。
| 方法名 | 描述 |
|---|---|
| toggleCheck | 设置目标复选框的选中状态。 |
| checkState | 获取目标复选框的选中状态。 |
export interface IQCheckBox extends IQtControl {
checkState(): Promise<boolean | 'partial'>
toggleCheck(checkState: boolean | 'partial'): Promise<void>
}class QCheckBox(QtControl):
def checkState() -> bool
def toggleCheck(checkState: bool) -> NonetoggleCheck(checkState)
设置目标复选框的选中状态。
参数:
- checkState:
boolean | 'partial'类型,true代表选中复选框,false代表取消选中目标复选框,'partial'代表部分选中,通常不使用。
返回值:
- 不返回任何值的异步方法。
使用示例
// 选中复选框
await model.getCheckBox("记住密码").toggleCheck(true);
// 取消选中复选框
await model.getCheckBox("记住密码").toggleCheck(false);# 选中复选框
model.getCheckBox("记住密码").toggleCheck(True)
# 取消选中复选框
model.getCheckBox("记住密码").toggleCheck(False)checkState()
获取目标复选框的选中状态,true代表已选中,false代表未选中。
返回值:
boolean | 'partial'类型,异步返回目标复选框是否选中。
使用示例
// 获取复选框的状态
let state = await model.getCheckBox("记住密码").checkState();
if (state === true) {
console.log("复选框已选中");
} else if (state === false) {
console.log("复选框未选中");
}# 获取复选框的状态
state = model.getCheckBox("记住密码").checkState()
if state == True:
print("复选框已选中")
elif state == False:
print("复选框未选中")组合框: ComboBox
针对带下拉框的一类特殊输入框的ComboBox控件,提供了选择指定下拉选项的操作方法。
| 方法名 | 描述 |
|---|---|
| open | 展开下拉框。 |
| select | 选择下拉框中的指定选项。 |
| selectedIndex | 获取当前选中的值在下拉框中的位置。 |
| selectedName | 获取当前选中的值。 |
| items | 获取目标组合框中所有可选选项的名称。 |
export interface IQComboBox extends IQtControl {
open(): Promise<void>;
select(nameOrIndex: String | number): Promise<void>;
selectedIndex(): Promise<number>;
selectedName(): Promise<string>;
items(): Promise<string[]>;
}class QComboBox(QtControl):
def open() -> None
def select(nameOrIndex: Union[str, int]) -> None
def selectedIndex() -> int
def selectedName() -> str
def items() -> List[str]open()
展开下拉框,可以视作触发了目标右侧的▼按钮。
返回值:
- 不返回任何值的异步方法。
使用示例
可通过invoke("hidePopup")的方式折叠下拉框。
// 通过open()方法展开下拉框
await model.getComboBox("combo_name").open();
// 通过invoke("hidePopup")方法折叠下拉框
await model.getComboBox("combo_name").invoke("hidePopup");# 通过open()方法展开下拉框
model.getComboBox("combo_name").open()
# 通过invoke("hidePopup")方法折叠下拉框
model.getComboBox("combo_name").invoke("hidePopup")select(nameOrIndex)
选择下拉框中的指定选项。
参数:
- nameOrIndex:
number或string类型。如果为数字,则会选中下拉框中相应索引位置的选项;如果为字符串,则会选择下拉框中相应名称的选项。
返回值:
- 不返回任何值的异步方法。
使用示例
// 通过索引选择第一个选项
await model.getComboBox("城市选择").select(0);
// 通过名称选择选项
await model.getComboBox("城市选择").select("北京");# 通过索引选择第一个选项
model.getComboBox("城市选择").select(0)
# 通过名称选择选项
model.getComboBox("城市选择").select("北京")selectedIndex()
获取当前选中的值在下拉框中的位置。
返回值:
number类型,异步返回当前值在下拉框中的索引位置。
使用示例
// 获取当前选中项的索引
let index = await model.getComboBox("城市选择").selectedIndex();
console.log(`当前选中项索引: ${index}`);# 获取当前选中项的索引
index = model.getComboBox("城市选择").selectedIndex()
print(f"当前选中项索引: {index}")selectedName()
获取当前选中的值。
返回值:
string类型,异步返回当前选中的值。
使用示例
// 获取当前选中的选项名称
let selected = await model.getComboBox("城市选择").selectedName();
console.log(`当前选中: ${selected}`);# 获取当前选中的选项名称
selected = model.getComboBox("城市选择").selectedName()
print(f"当前选中: {selected}")items()
获取目标组合框中所有可选选项的名称。
返回值:
string[]类型,异步返回所有可选选项的名称组成的字符串数组。
使用示例
// 获取所有可选项
let allItems = await model.getComboBox("城市选择").items();
console.log(`可选项: ${allItems.join(', ')}`);# 获取所有可选项
all_items = model.getComboBox("城市选择").items()
print(f"可选项: {', '.join(all_items)}")选值框: SpinBox
针对应用中带上下箭头的选值框SpinBox控件,为其提供了触发其增加/减少值的操作API。
SpinBox控件继承自Edit控件,也就是说它除了以下的方法外,还能够使用Edit控件的方法。这点可以从类型文件中看出来。
| 方法名 | 描述 |
|---|---|
| increment | 使取值框的值增加一个单位。 |
| decrement | 使取值框的值减少一个单位。 |
该控件的类型定义如下:
export interface IQSpinBox extends IQEdit {
increment(): Promise<void>;
decrement(): Promise<void>;
}class QSpinBox(QEdit):
def increment() -> None
def decrement() -> Noneincrement()
使取值框的值增加一个单位,单位大小取决于应用中的设置。可以理解为触发了一次取值框中的上箭头。
返回值:
- 不返回任何值的异步方法。
使用示例
// 增加数值
await model.getSpinBox("数量").increment();
// 连续增加多次
for (let i = 0; i < 5; i++) {
await model.getSpinBox("数量").increment();
}# 增加数值
model.getSpinBox("数量").increment()
# 连续增加多次
for i in range(5):
model.getSpinBox("数量").increment()decrement()
使取值框的值减少一个单位,单位大小取决于应用中的设置。可以理解为触发了一次取值框中的下箭头。
返回值:
- 不返回任何值的异步方法。
使用示例
// 减少数值
await model.getSpinBox("数量").decrement();
// 连续减少多次
for (let i = 0; i < 3; i++) {
await model.getSpinBox("数量").decrement();
}# 减少数值
model.getSpinBox("数量").decrement()
# 连续减少多次
for i in range(3):
model.getSpinBox("数量").decrement()应用控件: Application
针对应用本身的一个控件,通常作为最顶层控件存在,提供了获取应用属性和操作应用的方法。
| 方法名 | 描述 |
|---|---|
| launch | 启动应用。 |
| quit | 退出应用。 |
| exists | 检查应用是否存在。 |
| appInfo | 获取应用自身的信息。 |
| pid | 获取应用的进程号。 |
| topControls | 获取顶层控件。 |
| findAll | 遍历所有同名进程。 |
| fromPoint | 从屏幕坐标点获取控件。 |
export interface IQApplication extends IQtControl {
launch(waitSeconds?: number): Promise<IQApplication>
launch(appPath?: string, waitSeconds?: number): Promise<IQApplication>
quit(): Promise<void>;
exists(seconds?: number): Promise<boolean>
appInfo(): Promise<AppInfo>;
pid(): Promise<number>;
topControls(): Promise<IQtControl[]>;
findAll(): Promise<IQtControl[]>;
fromPoint(x: number, y: number): Promise<IQtControl[]>;
}
export interface AppInfo {
appName: string,
appPath: string,
appVersion: string,
pid: number,
}class QApplication(QtContainer):
def launch(appPath=None, waitSeconds=10): QApplication
def quit() -> None
def exists(seconds=5) -> bool
def appInfo() -> "AppInfo"
def pid() -> int
def topControls() -> List[QtControl]
def findAll() -> List[QtControl]
def fromPoint(x: int, y: int) -> List[QtControl]
class AppInfo():
appName: str
appPath: str
appVersion: str
pid: intappInfo()
获取应用自身的信息,比如应用名称、版本、路径等等信息。
返回值:
AppInfo类型,包含了应用名称、路径、版本和进程号的对象。
使用示例
// 获取应用的详细信息
let info = await model.getApplication("basiclayouts").appInfo();
console.log(`应用名称: ${info.appName}`);
console.log(`应用路径: ${info.appPath}`);
console.log(`应用版本: ${info.appVersion}`);
console.log(`进程ID: ${info.pid}`);# 获取应用的详细信息
info = model.getApplication("basiclayouts").appInfo()
print(f"应用名称: {info['appName']}")
print(f"应用路径: {info['appPath']}")
print(f"应用版本: {info['appVersion']}")
print(f"进程ID: {info['pid']}")pid()
获取应用的进程号。
返回值:
number类型,进程编号。
使用示例
// 获取应用进程ID
let processId = await model.getApplication("basiclayouts").pid();
console.log(`应用进程ID: ${processId}`);# 获取应用进程ID
process_id = model.getApplication("basiclayouts").pid()
print(f"应用进程ID: {process_id}")launch(appPath?, waitSeconds?)
启动应用,如果不传入appPath,会自动的使用Application对象在模型中的appPath属性。会自动的等待应用进程启动后再完成,这个等待的最长时间由waitSeconds参数控制,默认为10秒,表示如果超过10秒仍未检测到应用进程,则会抛错。
参数:
- appPath:(可选)应用路径,如果不填写,默认使用对象在模型中的appPath属性。
- waitSeconds:(可选)等待应用进程出现的超时时间,默认为10秒。
返回值:
Promise<Application>对象,异步的返回被启动的应用对象。
使用示例
假设模型
model1.tmodel中存在Application节点,名为basiclayouts,appPath属性为C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe,那么以下两种写法等效:
const { QtAuto } = require("leanpro.qt");
(async () => {
let modelQt = QtAuto.loadModel("model1.tmodel");
// 方法一:先启动进程,再等待应用就绪
await QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe");
await modelQt.getApplication("basiclayouts").exists(10);
// 方法二:直接使用 launch() 方法
await modelQt.getApplication("basiclayouts").launch();
// 也可以指定应用路径和超时时间
await modelQt.getApplication("basiclayouts").launch("C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe", 15);
})()from leanproAuto import QtAuto
modelQt = QtAuto.loadModel("model1.tmodel")
# 方法一:先启动进程,再等待应用就绪
QtAuto.launchQtProcessAsync("C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe")
modelQt.getApplication("basiclayouts").exists(10)
# 方法二:直接使用 launch() 方法
modelQt.getApplication("basiclayouts").launch()
# 也可以指定应用路径和超时时间
modelQt.getApplication("basiclayouts").launch("C:/Program Files/LeanPro/CukeTest/bin/basiclayouts.exe", 15)quit()
退出应用。会关闭应用以及属于应用的所有子窗口。
返回值:
- 不返回任何值的异步方法。
使用示例
// 退出应用
await model.getApplication("basiclayouts").quit();# 退出应用
model.getApplication("basiclayouts").quit()findAll()
遍历所有同名进程。
返回值:
- 所有匹配应用对象,且允许在返回的对象上继续调用模型节点。
使用示例
// 获取所有同名应用进程
const apps = await modelQt.getApplication("standarddialogs").findAll()
// 定位PID最小的进程
let appsPID = await Promise.all(apps.map(async (app) => app.pid()))
const minimalPID = appsPID.slice().sort()[0]
const app = apps[appsPID.indexOf(minimalPID)]
const currentAppPID = await app.pid()
assert.equal(currentAppPID, minimalPID);
// 遍历操作所有进程
// 注意:允许在返回的对象上继续调用模型节点
for (let app of apps) {
// 激活窗口
await app.getWindow("Standard_Dialogs").activate()
// 点击 "QInputDialog::getInt()" 按钮
await app.getButton("QInputDialog::getInt()").click();
await app.getButton("OK").click()
// 点击 "QInputDialog::getMultiLineText" 按钮
await app.getButton("QInputDialog::getMultiLineText").click();
await app.getButton("OK").click()
await app.getButton("QInputDialog::getMultiLineText").click();
}
// 关闭所有进程
for (let app of apps) {
await app.quit()
}# 获取所有同名应用进程
apps = modelQt.getApplication("standarddialogs").findAll()
# 定位PID最小的进程
apps_pid = [app.pid() for app in apps]
minimal_pid = sorted(apps_pid)[0]
app = apps[apps_pid.index(minimal_pid)]
current_app_pid = app.pid()
assert current_app_pid == minimal_pid
# 遍历操作所有进程
for app in apps:
# 激活窗口
app.getWindow("Standard_Dialogs").activate()
# 点击 "QInputDialog::getInt()" 按钮
app.getButton("QInputDialog::getInt()").click()
app.getButton("OK").click()
# 点击 "QInputDialog::getMultiLineText" 按钮
app.getButton("QInputDialog::getMultiLineText").click()
app.getButton("OK").click()
app.getButton("QInputDialog::getMultiLineText").click()
# 关闭所有进程
for app in apps:
app.quit()fromPoint(x, y)
从屏幕坐标点获取控件。
参数:
- x:
number类型,整个屏幕的水平像素。 - y:
number类型,整个屏幕的垂直像素。
返回值:
- 屏幕指定位置的控件。如果该坐标在应用窗口范围之外,则返回为空。
使用示例
示例:查找名为button1的按钮右侧100个像素位置的控件
// 获取按钮button1的屏幕位置坐标信息
let rect = await model.getButton("button1").rect();
// 计算button1中心坐标,并将水平坐标增加100个像素
let x = Math.floor(rect.x + rect.width / 2) + 100;
let y = Math.floor(rect.y + rect.height / 2);
// 根据屏幕坐标查找控件,并打印控件属性
let wid = await model.getApplication("app_name").fromPoint(x, y);
let prop = await wid.allProperties();
console.log(prop);# 获取按钮button1的屏幕位置坐标信息
rect = model.getButton("button1").rect()
# 计算button1中心坐标,并将水平坐标增加100个像素
x = int(rect.x + rect.width / 2) + 100
y = int(rect.y + rect.height / 2)
# 根据屏幕坐标查找控件,并打印控件属性
wid = model.getApplication("app_name").fromPoint(x, y)
prop = wid.allProperties()
print(prop)菜单栏控件和菜单栏选项控件: MenuBar & MenuBarItem
针对应用中的工具栏操作的MenuBar控件,以及工具栏中的按钮——MenuBarItem控件,通常只用于点击或打开菜单按钮展开菜单栏。如果需要直接操作菜单选项,建议阅读菜单控件[Menu&MenuItem]的invoke()方法。
MenuBar 控件方法:
| 方法名 | 描述 |
|---|---|
| open | 打开目标菜单栏选项。 |
| items | 获取菜单栏中的所有选项的控件对象。 |
MenuBarItem 控件方法:
| 方法名 | 描述 |
|---|---|
| open | 打开菜单项。 |
| text | 获取菜单项文本。 |
export interface IQMenuBar extends IQtControl {
open(itemName: String): Promise<void>;
items(): Promise<IQMenuBarItem>;
}
export interface IQMenuBarItem extends IQtControl {
open(): Promise<void>;
text(): Promise<string>;
}class QMenuBar(QtControl):
def open(itemName: str) -> None
def items() -> List[QMenuBarItem]
class QMenuBarItem(QtControl):
def itemIndex() -> int
def open(itemName: str) -> None
def text() -> strMenuBar提供的方法:
open(itemName)
打开目标菜单栏选项,传入目标菜单栏选项的名称。
如果是
MenuBarItem上的open()方法则不需要传入任何参数。
参数:
- itemName:
string类型,目标菜单栏选项的名称。
返回值:
- 不返回任何值的异步方法。
使用示例
// 打开菜单栏中的 "File" 选项
await model.getMenuBar("MainMenuBar").open("File");# 打开菜单栏中的 "File" 选项
model.getMenuBar("MainMenuBar").open("File")items()
获取菜单栏中的所有选项的控件对象。
返回值:
IQMenuBarItem[]类型,由所有菜单栏选项控件对象组成的数组。
使用示例
// 获取所有菜单栏选项
let menuItems = await model.getMenuBar("MainMenuBar").items();
console.log(`菜单栏选项数量: ${menuItems.length}`);
// 遍历所有菜单栏选项
for (let item of menuItems) {
let itemText = await item.text();
console.log(`菜单项: ${itemText}`);
}# 获取所有菜单栏选项
menu_items = model.getMenuBar("MainMenuBar").items()
print(f"菜单栏选项数量: {len(menu_items)}")
# 遍历所有菜单栏选项
for item in menu_items:
item_text = item.text()
print(f"菜单项: {item_text}")下面是菜单栏选项控件MenuBarItem提供的方法:
open()
打开菜单项。
返回值:
- 不返回任何值的异步方法。
使用示例
// 通过 items() 获取菜单项后打开
let menuItems = await model.getMenuBar("MainMenuBar").items();
await menuItems[0].open();# 通过 items() 获取菜单项后打开
menu_items = model.getMenuBar("MainMenuBar").items()
menu_items[0].open()text()
获取菜单项文本。
返回值:
string类型,返回菜单项的文本。
使用示例
校验获取菜单栏下的菜单项File控件的文本。
// 获取菜单项文本并验证
let text = await model.getMenuItem("File").text();
assert.equal(text, 'File');# 获取菜单项文本并验证
text = model.getMenuItem("File").text()
assert text == 'File'菜单控件和菜单选项控件: Menu & MenuItem
针对应用中的菜单和菜单选项的控件,Menu和MenuItem,操作菜单的选择、展开和隐藏。
Menu 控件方法:
| 方法名 | 描述 |
|---|---|
| invoke | 直接触发目标菜单中的菜单项。 |
| show | 展开目标菜单。 |
| hide | 隐藏目标菜单。 |
| itemNames | 获取目标菜单中的所有菜单项名称。 |
| items | 获取目标菜单中的所有菜单项对象。 |
MenuItem 控件方法:
| 方法名 | 描述 |
|---|---|
| invoke | 直接触发目标菜单项。 |
| checkable | 获取菜单项是否可以勾选。 |
| toggleCheck | 改变菜单项勾选状态。 |
| checked | 获取菜单项的勾选状态。 |
| text | 获取菜单项的文本内容。 |
| itemIndex | 获取菜单项的index。 |
| hover | 使鼠标悬停在目标菜单项上。 |
关于菜单控件的定义如下,但最常用和关键的是invoke()操作方法,在后面进行介绍:
export interface IQMenu extends IQtControl {
invoke(itemName: string): Promise<void>;
show(): Promise<void>;
hide(): Promise<void>;
itemNames(): Promise<string[]>;
items(): Promise<<MenuItem[]>>;
}
export interface IQMenuItem extends IQtControl {
invoke(): Promise<void>;
toggleCheck(value: boolean): Promise<void>;
checked(): Promise<boolean>;
checkable(): Promise<boolean>;
text(): Promise<string>;
itemIndex(): Promise<number>;
hover(): Promise<void>;
}class QMenu(QtControl):
def invoke(itemName: str) -> None
def show() -> None
def hide() -> None
def itemNames() -> List[str]
def items() -> List[QMenuItem]
class QMenuItem(QtControl):
def invoke() -> None
def toggleCheck(value: bool) -> None
def checked() -> bool
def checkable() -> bool
def text() -> str
def itemIndex() -> int
def hover() -> Noneinvoke(itemName)
直接触发目标菜单中的菜单项。在Menu控件中需要传入目标菜单项的名称;而在MenuItem控件中,不需要传入任何参数。
此方法不会展开菜单,而是通过通信直接触发目标菜单项功能,因此在用户角度不会观察到菜单的变化。
参数:
- itemName:目标菜单项的名称,需要为目标菜单的一级菜单项。
返回值:
- 不返回任何值的异步方法。
使用示例
// 直接触发菜单中的 "New" 菜单项
await model.getMenu("File").invoke("New");# 直接触发菜单中的 "New" 菜单项
model.getMenu("File").invoke("New")show()
展开目标菜单。
返回值:
- 不返回任何值的异步方法。
使用示例
// 展开菜单
await model.getMenu("File").show();# 展开菜单
model.getMenu("File").show()hide()
隐藏目标菜单。
返回值:
- 不返回任何值的异步方法。
使用示例
// 隐藏菜单
await model.getMenu("File").hide();# 隐藏菜单
model.getMenu("File").hide()itemNames()
获取目标菜单中的所有菜单项名称。
返回值:
string[]类型,返回所有菜单项名称组成的字符串数组。
使用示例
// 获取菜单中的所有菜单项名称
let names = await model.getMenu("File").itemNames();
console.log(`菜单项: ${names.join(', ')}`);# 获取菜单中的所有菜单项名称
names = model.getMenu("File").itemNames()
print(f"菜单项: {', '.join(names)}")items()
获取目标菜单中的所有菜单项对象。
返回值:
MenuItem[]类型,返回所有菜单项对象组成的对象数组。
使用示例
// 获取所有菜单项对象并遍历
let items = await model.getMenu("File").items();
for (let item of items) {
let text = await item.text();
console.log(`菜单项: ${text}`);
}# 获取所有菜单项对象并遍历
items = model.getMenu("File").items()
for item in items:
text = item.text()
print(f"菜单项: {text}")以下是MenuItem对象的方法。
invoke()
直接触发目标菜单项。
此方法不会展开菜单,而是通过通信直接触发目标菜单项功能,因此在用户角度不会观察到菜单的变化。
返回值:
- 不返回任何值的异步方法。
使用示例
// 直接触发菜单项
await model.getMenuItem("New").invoke();# 直接触发菜单项
model.getMenuItem("New").invoke()checkable()
获取菜单项是否可以勾选。一些菜单项是通过点击来切换勾选状态,此方法用于获取菜单项的可勾选情况。
返回值:
boolean类型,表示菜单项是否可勾选。
使用示例
// 检查菜单项是否可勾选
let canCheck = await model.getMenuItem("ShowToolbar").checkable();
console.log(`菜单项可勾选: ${canCheck}`);# 检查菜单项是否可勾选
can_check = model.getMenuItem("ShowToolbar").checkable()
print(f"菜单项可勾选: {can_check}")toggleCheck(value)
改变菜单项勾选状态。一些菜单项是通过点击来切换勾选状态,此方法用于修改勾选状态。需要checkable()方法返回true的菜单项才能用此方法。
参数:
- value:
boolean类型,表示勾选状态。
返回值:
- 不返回任何值的异步方法。
使用示例
// 设置菜单项为勾选状态
await model.getMenuItem("ShowToolbar").toggleCheck(true);
// 取消菜单项的勾选状态
await model.getMenuItem("ShowToolbar").toggleCheck(false);# 设置菜单项为勾选状态
model.getMenuItem("ShowToolbar").toggleCheck(True)
# 取消菜单项的勾选状态
model.getMenuItem("ShowToolbar").toggleCheck(False)checked()
获取菜单项的勾选状态。
返回值:
boolean类型,表示勾选状态。
使用示例
// 获取菜单项的勾选状态
let isChecked = await model.getMenuItem("ShowToolbar").checked();
console.log(`菜单项已勾选: ${isChecked}`);# 获取菜单项的勾选状态
is_checked = model.getMenuItem("ShowToolbar").checked()
print(f"菜单项已勾选: {is_checked}")text()
获取菜单项的文本内容。
返回值:
string类型,菜单项文本。
使用示例
点击菜单控件Menu,校验获取菜单项About_Qt控件的文本内容。
// 点击菜单并获取菜单项文本
model.getMenu("Help").click();
let text = await model.getMenuItem("About_Qt").text();
assert.equal(text, 'About_Qt');# 点击菜单并获取菜单项文本
model.getMenu("Help").click()
text = model.getMenuItem("About_Qt").text()
assert text == 'About_Qt'itemIndex()
获取菜单项的index,即标识属性中的itemIndex值。
返回值:
number类型,菜单项index。
使用示例
// 获取菜单项的索引
let index = await model.getMenuItem("New").itemIndex();
console.log(`菜单项索引: ${index}`);# 获取菜单项的索引
index = model.getMenuItem("New").itemIndex()
print(f"菜单项索引: {index}")hover()
使鼠标悬停在目标菜单项上,可以用于展开子菜单项。
返回值:
- 不返回任何值的异步方法。
使用示例
// 悬停在菜单项上以展开子菜单
await model.getMenuItem("File").hover();# 悬停在菜单项上以展开子菜单
model.getMenuItem("File").hover()进度条控件: ProgressBar
针对应用中的进度条所支持的控件,可以通过调用value()方法取得进度条的值。
由于进度条的值通常是受控于内部逻辑或者其它控件,因此不支持直接修改其值。
| 方法名 | 描述 |
|---|---|
| value | 获取当前进度条中的值并返回。 |
形状如下:
类型文件如下:
export interface IQProgressBar extends IQtControl {
value(): Promise<number>;
}class QProgressBar(QtControl):
def value() -> intvalue()
获取当前进度条中的值并返回。因为返回结果是数字,因此会省略百分比%号。
返回值:
number类型,进度条的当前值。
使用示例
// 获取进度条的当前值
let progress = await model.getProgressBar("downloadProgress").value();
console.log(`当前进度: ${progress}%`);# 获取进度条的当前值
progress = model.getProgressBar("downloadProgress").value()
print(f"当前进度: {progress}%")旋钮控件: Dial
针对用于手动调节值的旋钮控件,功能与滑动条控件类似,是Qt为了适配触屏应用推出的控件。
| 方法名 | 描述 |
|---|---|
| value | 获取当前旋钮的值并返回。 |
| setValue | 设置旋钮的值。 |
形状如下:
export interface IQDial extends IQtControl {
value(): Promise<number>;
setValue(value: number): Promise<void>;
}class QDial(QtControl):
def value() -> int
def setValue(value: int) -> Nonevalue()
获取当前旋钮的值并返回。
返回值:
number类型,旋钮的当前值。
使用示例
// 获取旋钮的当前值
let dialValue = await model.getDial("volumeDial").value();
console.log(`旋钮值: ${dialValue}`);# 获取旋钮的当前值
dial_value = model.getDial("volumeDial").value()
print(f"旋钮值: {dial_value}")setValue(value)
设置旋钮的值,将旋钮旋至指定值的位置,但不会超出最大值。
参数:
- value:
number类型,将旋钮旋至指定值的位置。
返回值:
- 不返回任何值的异步方法。
使用示例
// 设置旋钮的值为 50
await model.getDial("volumeDial").setValue(50);# 设置旋钮的值为 50
model.getDial("volumeDial").setValue(50)滑动条控件: Slider
针对用于接收用户设定的值的滑动条控件。
| 方法名 | 描述 |
|---|---|
| value | 获取当前滑动条的值并返回。 |
| setValue | 设置滑动条的值。 |
export interface IQSlider extends IQtControl {
value(): Promise<number>;
setValue(value: number): Promise<void>;
}class QSlider(QtControl):
def value() -> int
def setValue(value: int) -> Nonevalue()
获取当前滑动条的值并返回。
返回值:
number类型,滑动条的当前值。
使用示例
// 获取滑动条的当前值
let sliderValue = await model.getSlider("volumeSlider").value();
console.log(`滑动条值: ${sliderValue}`);# 获取滑动条的当前值
slider_value = model.getSlider("volumeSlider").value()
print(f"滑动条值: {slider_value}")setValue(value)
设置滑动条的值,将滑块拖拽至指定值的位置,但不会超出最大值。
参数:
- value:
number类型,将滑块拖拽至指定值的位置。
返回值:
- 不返回任何值的异步方法。
使用示例
// 设置滑动条的值为 75
await model.getSlider("volumeSlider").setValue(75);# 设置滑动条的值为 75
model.getSlider("volumeSlider").setValue(75)滚动区域控件: ScrollArea
作为一种容器,当容器中内容较多时,可以进行滚动浏览。由于有时候该控件会设置为不显示滚动条,因此另外支持了一个用于滚动的方法——ensureVisible()方法进行滚动。
| 方法名 | 描述 |
|---|---|
| ensureVisible | 滚动到目标位置。 |
export interface IQScrollArea extends IQtControl {
ensureVisible(x:number, y: number);
}class QScrollArea(QtControl):
def ensureVisible(x: int, y: int) -> NoneensureVisible(x, y)
滚动到目标位置(相对滚动区域左上角顶点而言)。
参数:
- x:
number类型,水平像素数。 - y:
number类型,垂直像素数。
返回值:
- 不返回任何值的异步方法。
使用示例
// 滚动到指定位置
await model.getScrollArea("contentArea").ensureVisible(100, 200);# 滚动到指定位置
model.getScrollArea("contentArea").ensureVisible(100, 200)标签栏控件和标签页控件: TabBar & Tab & TabItem
针对应用中的标签页的控件,Tab和TabItem,进行标签页的切换。同时提供了控制标签页所在栏——标签栏控件TabBar。
TabBar 控件方法:
| 方法名 | 描述 |
|---|---|
| activate | 激活目标标签页。 |
| closeTab | 关闭目标标签页。 |
| count | 获取标签栏中的标签页数量。 |
| activeIndex | 获取当前界面中被激活的标签索引值。 |
| activeName | 获取当前界面中被激活的标签名称。 |
| tabNames | 获取所有标签页的标题。 |
Tab 控件方法:
| 方法名 | 描述 |
|---|---|
| getItem | 获取指定标签页的自动化对象。 |
| activate | 激活目标标签页。 |
| closeTab | 关闭目标标签页。 |
| activeName | 获取当前界面中被激活的标签名称。 |
| activeIndex | 获取当前界面中被激活的标签索引值。 |
| count | 获取标签栏中的标签页数量。 |
| items | 获取所有标签页。 |
TabItem 控件方法:
| 方法名 | 描述 |
|---|---|
| activate | 激活标签页。 |
| closeTab | 关闭标签页。 |
| text | 获取标签页标题。 |
| itemIndex | 获取标签页的index。 |
关于标签栏控件的定义如下:
export interface IQTabBar extends IQtControl {
activate(itemNameOrIndex: string | number): Promise<void>;
closeTab(itemNameOrIndex: string | number): Promise<void>;
count(): Promise<string[]>;
activeIndex(): Promise<number>;
activeName(): Promise<string>;
tabNames(): Promise<string[]>;
}
export interface IQTab extends IQtControl {
getItem(itemNameOrIndex: string | number): IQTabItem;
activate(itemNameOrIndex: string | number): Promise<void>;
closeTab(itemNameOrIndex: string | number): Promise<void>;
activeName(): Promise<string>;
activeIndex(): Promise<number>;
count(): Promise<string[]>;
items(): Promise<string[]>;
}
export interface IQTabItem extends IQtControl {
activate(): Promise<void>;
closeTab(): Promise<void>;
text(): Promise<string>;
itemIndex(): Promise<number>;
}class QTabBar(QtControl):
def activate(itemNameOrIndex: Union[str, int]) -> None
def count() -> List[str]
def activeIndex() -> int
def activeName() -> str
def tabNames() -> List[str]
def closeTab(itemNameOrIndex: Union[str, int]) -> None
class QTab(QTabBar):
def getItem(itemNameOrIndex: Union[str, int]) -> "QTabItem"
class QTabItem(QtControl):
def activate() -> None
def text() -> str
def itemIndex() -> int
def closeTab() -> NonegetItem(itemNameOrIndex)
获取指定标签页的自动化对象,传入标签页的索引值或标题。
参数:
- itemNameOrIndex:
number或string类型,目标标签页的索引值或标签页标题。
返回值:
TabItem类型,同步的返回一个TabItem类型的操作对象。
使用示例
// 通过索引获取标签页
let tab = model.getTab("MainTab").getItem(0);
// 通过名称获取标签页
let tab2 = model.getTab("MainTab").getItem("首页");# 通过索引获取标签页
tab = model.getTab("MainTab").getItem(0)
# 通过名称获取标签页
tab2 = model.getTab("MainTab").getItem("首页")activate(itemNameOrIndex)
激活目标标签页,传入标签页的索引值或标题。
如果是
TabItem上的activate()方法则不需要传入任何参数。
参数:
- itemNameOrIndex:
number或string类型,目标标签页的索引值或标签页标题。
返回值:
- 不返回任何值的异步方法。
使用示例
// 通过索引激活标签页
await model.getTab("MainTab").activate(0);
// 通过名称激活标签页
await model.getTab("MainTab").activate("首页");# 通过索引激活标签页
model.getTab("MainTab").activate(0)
# 通过名称激活标签页
model.getTab("MainTab").activate("首页")closeTab(itemNameOrIndex)
关闭目标标签页,传入标签页的索引值或标题。
如果是
TabItem上的closeTab()方法则不需要传入任何参数。
参数:
- itemNameOrIndex:
number或string类型,目标标签页的索引值或标签页标题。
返回值:
- 不返回任何值的异步方法。
使用示例
// 通过索引关闭标签页
await model.getTab("MainTab").closeTab(1);
// 通过名称关闭标签页
await model.getTab("MainTab").closeTab("设置");# 通过索引关闭标签页
model.getTab("MainTab").closeTab(1)
# 通过名称关闭标签页
model.getTab("MainTab").closeTab("设置")activeIndex()
获取当前界面中被激活的标签索引值。
返回值:
number类型,标签页索引值。
使用示例
// 获取当前激活的标签页索引
let index = await model.getTab("MainTab").activeIndex();
console.log(`当前激活标签索引: ${index}`);# 获取当前激活的标签页索引
index = model.getTab("MainTab").activeIndex()
print(f"当前激活标签索引: {index}")activeName()
获取当前界面中被激活的标签名称。
返回值:
string类型,标签页的名称。
使用示例
// 获取当前激活的标签页名称
let name = await model.getTab("MainTab").activeName();
console.log(`当前激活标签: ${name}`);# 获取当前激活的标签页名称
name = model.getTab("MainTab").activeName()
print(f"当前激活标签: {name}")count()
获取标签栏中的标签页数量。
返回值:
number类型,标签页的数量。
使用示例
// 获取标签页数量
let tabCount = await model.getTab("MainTab").count();
console.log(`标签页数量: ${tabCount}`);# 获取标签页数量
tab_count = model.getTab("MainTab").count()
print(f"标签页数量: {tab_count}")items()
获取标签栏中的标签页的名称。
返回值:
string[]类型,由所有标签页标题组成的字符串数组。
使用示例
// 获取所有标签页名称
let tabNames = await model.getTab("MainTab").items();
console.log(`所有标签页: ${tabNames.join(', ')}`);# 获取所有标签页名称
tab_names = model.getTab("MainTab").items()
print(f"所有标签页: {', '.join(tab_names)}")以下是TabItem对象的方法。
activate()
激活标签页。
返回值:
- 不返回任何值的异步方法。
使用示例
// 激活指定的标签页
let tab = model.getTab("MainTab").getItem(1);
await tab.activate();# 激活指定的标签页
tab = model.getTab("MainTab").getItem(1)
tab.activate()closeTab()
关闭标签页。
返回值:
- 不返回任何值的异步方法。
使用示例
// 关闭指定的标签页
let tab = model.getTab("MainTab").getItem(1);
await tab.closeTab();# 关闭指定的标签页
tab = model.getTab("MainTab").getItem(1)
tab.closeTab()text()
获取标签页标题。
返回值:
string类型,返回标签页的标题。
使用示例
// 获取标签页标题
let tab = model.getTab("MainTab").getItem(0);
let title = await tab.text();
console.log(`标签页标题: ${title}`);# 获取标签页标题
tab = model.getTab("MainTab").getItem(0)
title = tab.text()
print(f"标签页标题: {title}")itemIndex()
获取标签页在整个标签栏中的次序。
返回值:
number类型,返回标签页的索引值。
使用示例
// 获取标签页的索引
let tab = model.getTab("MainTab").getItem("首页");
let index = await tab.itemIndex();
console.log(`标签页索引: ${index}`);# 获取标签页的索引
tab = model.getTab("MainTab").getItem("首页")
index = tab.itemIndex()
print(f"标签页索引: {index}")Quick控件: QuickItem
Qt自动化中有一类控件比较特殊,那就是在模型管理器中以Quick前缀显示的控件。代表该控件是基于Qt Quick技术开发的,与之对应的,本篇文档里面介绍的其它控件都是基于Qt Widget技术开发的。
| 方法名 | 描述 |
|---|---|
| text | 获取当前Quick控件中的文本。 |
| set | 设置当前Quick控件中的文本或值。 |
export interface QuickItem extends QtControl {
text(): Promise<string>;
set(text:string): Promise<void>;
}class QuickItem(QtControl):
def text() -> str
def set(text) -> Nonetext()
获取当前Quick控件中的文本。等效于调用property("text")。
返回值:
string类型,Quick控件内部的文本。
使用示例
下面两种调用的结果返回一致:
// 方法一:使用 text() 方法
let buttonText = await modelQt.getQuick("Button").text();
// 方法二:使用 property() 方法
let buttonText2 = await modelQt.getQuick("Button").property("text");
console.log(`按钮文本: ${buttonText}`);# 方法一:使用 text() 方法
button_text = modelQt.getQuick("Button").text()
# 方法二:使用 property() 方法
button_text2 = modelQt.getQuick("Button").property("text")
print(f"按钮文本: {button_text}")set(text)
设置当前Quick控件中的文本或值。
参数:
- text:
string字符串类型,需要设置的值。
返回值:
- 没有任何返回值的异步方法。
使用示例
// 设置Quick控件的文本
await modelQt.getQuick("InputField").set("新的文本内容");# 设置Quick控件的文本
modelQt.getQuick("InputField").set("新的文本内容")如果不确定被测应用具体的开发框架,可以参考如何确定Qt应用使用的技术。
Qt WebView/WebEngine
Qt WebEngine 是一个集成在Qt应用中的浏览器引擎,允许开发者在应用程序中嵌入和显示网页内容。下面是 Qt WebEngine 控件提供的方法,用于与内嵌网页进行交互:
| 方法名 | 描述 |
|---|---|
| runJavaScript | 执行指定的 JavaScript 代码。 |
| html | 获取当前页面的 HTML 内容。 |
| text | 获取当前页面的文本内容。 |
| url | 获取当前页面的 URL。 |
| setUrl | 设置页面的 URL。 |
| clickElement | 点击页面中的元素。 |
| highlightElement | 高亮显示页面中的元素。 |
| loaded | 等待页面加载完成。 |
export interface IQWebEngine extends IQtControl {
runJavaScript(code: string): Promise<string>;
html(): Promise<string>;
text(): Promise<string>;
url(): Promise<string>;
setUrl(url: string): Promise<void>;
clickElement(selector: string): Promise<void>;
highlightElement(selector: string): Promise<void>;
loaded(seconds?: number): Promise<boolean>;
}class IQWebEngine(IQtControl):
def runJavaScript(code: str) -> str
def html() -> str
def text() -> str
def url() -> str
def setUrl(url: str) -> None
def clickElement(selector: str) -> None
def highlightElement(selector: str) -> None
def loaded(seconds: Optional[int]=None) -> boolrunJavaScript(code)
执行指定的 JavaScript 代码。
参数:
- code:
string类型,表示要执行的 JavaScript 代码。
返回值:
- 字符串类型,返回 JavaScript 代码的执行结果。
使用示例
// 执行 JavaScript 代码点击按钮
let script = 'document.querySelector("button.ant-btn-primary").click()';
await modelQt.getWebEngine("WebView2").runJavaScript(script);
// 执行 JavaScript 代码并获取返回值
let titleScript = 'document.title';
let title = await modelQt.getWebEngine("WebView2").runJavaScript(titleScript);
console.log(`页面标题: ${title}`);# 执行 JavaScript 代码点击按钮
script = 'document.querySelector("button.ant-btn-primary").click()'
modelQt.getWebEngine("WebView2").runJavaScript(script)
# 执行 JavaScript 代码并获取返回值
title_script = 'document.title'
title = modelQt.getWebEngine("WebView2").runJavaScript(title_script)
print(f"页面标题: {title}")html()
获取当前页面的 HTML 内容。
返回值:
- 字符串类型,包含页面的 HTML 内容。
使用示例
// 获取页面 HTML 内容并验证
const html = await modelQt.getWebEngine("WebView2").html();
assert.ok(html.includes('<html>'));# 获取页面 HTML 内容并验证
html = modelQt.getWebEngine("WebView2").html()
assert "<html>" in htmltext()
获取当前页面的文本内容。
返回值:
- 字符串类型,包含页面的文本内容。
使用示例
// 获取页面文本内容并验证
const text = await modelQt.getWebEngine("WebView2").text();
assert.ok(text.includes('登录'));# 获取页面文本内容并验证
text = modelQt.getWebEngine("WebView2").text()
assert "登录" in texturl()
获取当前页面的 URL。
返回值:
- 字符串类型,表示页面的 URL。
使用示例
// 获取当前页面 URL
const url = await modelQt.getWebEngine("WebView2").url();
assert.equal(url, 'http://localhost:21477/user/login/');# 获取当前页面 URL
url = modelQt.getWebEngine("WebView2").url()
assert url == 'http://localhost:21477/user/login/'setUrl(url)
设置当前页面的 URL,并加载该页面。
参数:
- url:
string类型,表示要加载的 URL。
返回值:
- 没有任何返回值的异步方法。
使用示例
// 设置并加载新的 URL
const url = 'http://localhost:21477/user/login/';
await modelQt.getWebEngine("WebView2").setUrl(url);# 设置并加载新的 URL
url = 'http://localhost:21477/user/login/'
modelQt.getWebEngine("WebView2").setUrl(url)clickElement(selector)
点击指定的元素。
参数:
- selector:
string类型,表示要点击的元素的 CSS 选择器。
返回值:
- 没有任何返回值的异步方法。
使用示例
// 点击密码输入框
await modelQt.getWebEngine("WebView2").clickElement("#password");
// 点击登录按钮
await modelQt.getWebEngine("WebView2").clickElement("button.login-btn");# 点击密码输入框
modelQt.getWebEngine("WebView2").clickElement("#password")
# 点击登录按钮
modelQt.getWebEngine("WebView2").clickElement("button.login-btn")highlightElement(selector)
高亮显示指定的元素。
参数:
- selector:
string类型,表示要高亮显示的元素的 CSS 选择器。
返回值:
- 没有任何返回值的异步方法。
使用示例
// 高亮显示密码输入框
await modelQt.getWebEngine("WebView2").highlightElement("#password");
// 高亮显示登录按钮
await modelQt.getWebEngine("WebView2").highlightElement("button.login-btn");# 高亮显示密码输入框
modelQt.getWebEngine("WebView2").highlightElement("#password")
# 高亮显示登录按钮
modelQt.getWebEngine("WebView2").highlightElement("button.login-btn")loaded(seconds)
等待页面加载,或判断页面是否加载完成。
参数:
- seconds:(可选)
number类型,表示最长等待时间(超时时间),单位为秒。默认为0,即只检查一次,立即返回结果,不会等待或重试。
返回值:
boolean类型,异步的返回页面的加载结果。
使用示例
// 等待页面加载完成,最多等待 5 秒
await modelQt.getWebEngine("WebView").loaded(5);
// 立即检查页面是否已加载
let isLoaded = await modelQt.getWebEngine("WebView").loaded();
console.log(`页面已加载: ${isLoaded}`);# 等待页面加载完成,最多等待 5 秒
modelQt.getWebEngine("WebView").loaded(5)
# 立即检查页面是否已加载
is_loaded = modelQt.getWebEngine("WebView").loaded()
print(f"页面已加载: {is_loaded}")