入门指南
M8Test 实现了强大的网页自动化框架,允许您使用自动化脚本来测试网页。
异步与 Deferred
Controller 的所有方法都是异步的。这意味着调用一个方法(如 controller.click(...))不会立即执行点击操作,而是会安排这个操作在未来某个时间点执行。 这些方法会立即返回一个 Deferred 对象,可以理解为“一个对未来结果的承诺”。T 是结果的类型(例如,Deferred 表示未来会有一个字符串结果)。
使用 .then() 进行链式调用
它会注册一个回调函数。
当 deferred 成功完成时,这个回调函数会被执行。
result 参数是上一步 deferred 的结果。
最重要的是,.then 块必须返回一个新的 Deferred 对象,以继续这个链条。
import com.m8test.script.GlobalVariables.*
// 步骤1: 开始一个异步操作
// 假设 controller 在此上下文可用
// controller.asyncOperation1()
// 步骤2: 当操作1完成后,使用其结果来开始操作2
// .then { scope, result1 ->
// _console.log("操作1完成,结果:", result1)
// // 返回操作2的 Deferred
// // Kotlin lambda 中最后一行是返回值
// controller.asyncOperation2(result1)
// }
// 步骤3: 当操作2完成后...
// .then { scope, result2 ->
// _console.log("操作2完成,结果:", result2)
// // 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
// scope.resolve(null)
// }
// 统一的错误处理
// .onError { e ->
// _console.error("链条中任何一步发生错误:", e)
// }
// 步骤1: 开始一个异步操作
controller.asyncOperation1()
// 步骤2: 当操作1完成后,使用其结果来开始操作2
.then { scope, result1 ->
$console.log("操作1完成,结果:", result1)
// 返回操作2的 Deferred
return controller.asyncOperation2(result1)
}
// 步骤3: 当操作2完成后...
.then { scope, result2 ->
$console.log("操作2完成,结果:", result2)
// 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
return scope.resolve(null)
}
// 统一的错误处理
.onError { e ->
$console.error("链条中任何一步发生错误:", e)
}
// 步骤1: 开始一个异步操作
controller.asyncOperation1()
// 步骤2: 当操作1完成后,使用其结果来开始操作2
.then((scope, result1) => {
$console.log("操作1完成,结果:", result1);
// 返回操作2的 Deferred
return controller.asyncOperation2(result1);
})
// 步骤3: 当操作2完成后...
.then((scope, result2) => {
$console.log("操作2完成,结果:", result2);
// 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
return scope.resolve(null);
})
// 统一的错误处理
.onError(e => {
$console.error("链条中任何一步发生错误:", e);
});
-- 步骤1: 开始一个异步操作
controller:asyncOperation1()
-- 步骤2: 当操作1完成后,使用其结果来开始操作2
:_then(function(scope, result1)
_console:log("操作1完成,结果:", result1)
-- 返回操作2的 Deferred
return controller:asyncOperation2(result1)
end)
-- 步骤3: 当操作2完成后...
:_then(function(scope, result2)
_console:log("操作2完成,结果:", result2)
-- 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
return scope:resolve(nil)
end)
-- 统一的错误处理
:onError(function(e)
_console:error("链条中任何一步发生错误:", e)
end)
<?php
/** @var m8test_java\com\m8test\script\core\api\console\Console $console */
global $console;
// 步骤1: 开始一个异步操作
$controller->asyncOperation1()
// 步骤2: 当操作1完成后,使用其结果来开始操作2
->then(function ($scope, $result1) {
global $console;
$console->log(javaString("操作1完成,结果:"), $result1);
// 返回操作2的 Deferred
return $controller->asyncOperation2($result1);
})
// 步骤3: 当操作2完成后...
->then(function ($scope, $result2) {
global $console;
$console->log(javaString("操作2完成,结果:"), $result2);
// 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
return $scope->resolve(null);
})
// 统一的错误处理
->onError(function ($e) {
global $console;
$console->error(javaString("链条中任何一步发生错误:"), $e);
});
# 导入所需的全局变量
from m8test_java.com.m8test.script.GlobalVariables import _console
# 步骤1: 开始一个异步操作
# 假设 'controller' 是一个已定义的变量
# controller.asyncOperation1()
# 步骤2: 当操作1完成后,使用其结果来开始操作2
# .then(lambda scope, result1: (
# _console.log("操作1完成,结果:", str(result1)),
# # 返回操作2的 Deferred
# controller.asyncOperation2(result1)
# )[-1])
# # 步骤3: 当操作2完成后...
# .then(lambda scope, result2: (
# _console.log("操作2完成,结果:", str(result2)),
# # 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
# scope.resolve(None)
# )[-1])
# # 统一的错误处理
# .onError(lambda e:
# _console.error("链条中任何一步发生错误:", e)
# )
# encoding: utf-8
# 步骤1: 开始一个异步操作
controller.asyncOperation1().
# 步骤2: 当操作1完成后,使用其结果来开始操作2
then { |scope, result1|
$console.log("操作1完成,结果:", result1)
# 返回操作2的 Deferred
controller.asyncOperation2(result1)
}.
# 步骤3: 当操作2完成后...
then { |scope, result2|
$console.log("操作2完成,结果:", result2)
# 如果没有更多异步操作,可以用 scope.resolve() 来结束链条
scope.resolve(nil)
}.
# 统一的错误处理
onError { |e|
$console.error("链条中任何一步发生错误:", e)
}
这种模式确保了您的代码始终保持非阻塞,响应迅速。
09 December 2025