M8Test Help

入门指南

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