如何重构Selenium脚本中需顺序执行的多个For循环?
重构连续顺序执行的For循环方案
嘿,这种重复的for循环确实看着闹心,既冗余又不好维护——尤其当后续要加更多Method_3、Method_4的时候,只会越来越乱。既然你需要严格按「先跑完n次Method_1,再跑完n次Method_2,依此类推」的顺序执行,给你几个实用的重构思路:
方案1:封装任务-次数对,统一执行循环
核心思路是把每个要执行的方法和它的循环次数(这里都是n)打包成一组任务,然后用一个外层循环统一处理所有任务的执行逻辑,避免重复写for循环模板。
无参数方法示例(对应你的原代码)
import java.util.AbstractMap; import java.util.Arrays; import java.util.List; // 1. 定义任务列表:把方法和执行次数配对 List<AbstractMap.SimpleEntry<Runnable, Integer>> taskQueue = Arrays.asList( new AbstractMap.SimpleEntry<>(this::Method_1, n), new AbstractMap.SimpleEntry<>(this::Method_2, n) // 后续加新方法直接在这里追加一行即可,比如 new AbstractMap.SimpleEntry<>(this::Method_3, n) ); // 2. 统一执行所有任务 for (AbstractMap.SimpleEntry<Runnable, Integer> taskEntry : taskQueue) { Runnable targetMethod = taskEntry.getKey(); int executeTimes = taskEntry.getValue(); for (int i = 0; i < executeTimes; i++) { targetMethod.run(); } }
带参数方法示例(如果方法需要用到循环变量i)
如果你的方法需要接收循环次数参数,比如Method_1(int i),可以换成Consumer<Integer>来承载任务:
import java.util.AbstractMap; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; List<AbstractMap.SimpleEntry<Consumer<Integer>, Integer>> taskQueue = Arrays.asList( new AbstractMap.SimpleEntry<>(i -> Method_1(i), n), new AbstractMap.SimpleEntry<>(i -> Method_2(i), n) ); for (AbstractMap.SimpleEntry<Consumer<Integer>, Integer> taskEntry : taskQueue) { Consumer<Integer> targetMethod = taskEntry.getKey(); int executeTimes = taskEntry.getValue(); for (int i = 0; i < executeTimes; i++) { targetMethod.accept(i); } }
方案2:用命令模式封装(适合复杂场景)
如果后续需要给任务加额外逻辑(比如失败重试、日志记录),可以把每个方法封装成一个Command类,扩展性更强:
// 定义命令接口 interface TaskCommand { void execute(int times); } // 实现具体命令 class Method1Command implements TaskCommand { @Override public void execute(int times) { for (int i = 0; i < times; i++) { Method_1(); // 可以在这里加日志、重试逻辑等 } } } class Method2Command implements TaskCommand { @Override public void execute(int times) { for (int i = 0; i < times; i++) { Method_2(); } } } // 执行命令链 List<TaskCommand> commands = Arrays.asList(new Method1Command(), new Method2Command()); for (TaskCommand cmd : commands) { cmd.execute(n); }
重构后的优势
- 消除冗余:不用重复写一模一样的
for循环结构,代码更简洁; - 易维护:新增方法、调整执行顺序/次数,只需要修改任务列表/命令列表,不用改动循环逻辑;
- 可读性强:执行顺序一目了然,其他开发者能快速理解整个流程;
- 扩展性好:后续要加日志、重试、异常处理等逻辑,只需要在统一的执行块或命令类里修改,不用逐个修改每个方法的循环。
内容的提问来源于stack exchange,提问作者Mike ASP
相关产品推荐
相关产品推荐

