从检测点到资源编排:华为云 KooLabs 云实验自动化的三次踩坑复盘
背景
过去两天我用自动化脚本跑华为云 KooLabs 的云实验,目标很简单:把"每周实践一个实验"这类重复任务交给脚本。结果踩了三个坑,每一个都不是"点不到按钮"这么简单。记录一下,避免别人重复。
坑一:进度不是看时长,而是看检测点
实验页面顶部有个"已完成 x%",我一度以为它统计的是停留时长或页面浏览。实际官方说明写得很清楚:平台会在任务完成后通过云服务侧检测刷新进度,而且步骤必须按手册逐步完成。
证据:我在沙箱 ECS 里用 SSH 把 Docker 装好、镜像拉下来、容器跑出 Hello from Docker!,进度纹丝不动;而后来在沙箱账号的控制台里老老实实点"创建虚拟私有云",建出 vpc-xxxx 之后,进度立刻从 0% 跳到 20%。
结论:能被检测的是云资源对象,不是机器内部状态。
坑二:按钮"点不到"往往是遮罩和视口
自动化最常遇到的"点了没反应",我这次遇到两种原因:
- 新手引导遮罩:实验台会弹"第一步:右键单击打开控制台"的引导层,它有全屏透明遮罩,把整页点击全吃掉;
- 元素在视口外:控制台页面高度约 889px,而按钮在 y=853 的位置,用固定坐标点击等于点在空白处。
解决办法很朴素:先 scrollIntoView({block:'center'}),重新取一次 getBoundingClientRect(),再按新坐标点击;同时把所有引导弹窗先点掉。
一个可复用的写法:
async function clickByText(page, text) {
const pos = await page.evaluate((t) => {
const els = [...document.querySelectorAll('button,a,span')]
.filter(e => e.innerText.trim() === t && e.getBoundingClientRect().width > 0);
if (!els.length) return null;
els[els.length - 1].scrollIntoView({ block: 'center' });
const r = els[els.length - 1].getBoundingClientRect();
return { x: r.x + r.width / 2, y: r.y + r.height / 2, h: innerHeight };
}, text);
if (!pos || pos.y < 10 || pos.y > pos.h - 10) return false;
await page.mouse.click(pos.x, pos.y);
return true;
}
坑三:沙箱账号要用隔离会话,不要污染自己的登录态
实验会给一组临时 IAM 账号,官方建议用无痕窗口。用自动化时对应的做法是:从实验页的接口里拿到一次性联邦登录链接,在独立的浏览器上下文里打开,既能自动登录,又不会覆盖自己的会话。
另外还有一个镜像源的小细节:沙箱 ECS 出网受限,docker pull 直连 Docker Hub 会超时,换成华为 SWR 的镜像地址(swr.<region>.myhuaweicloud.com/ddn-k8s/docker.io/library/...)后秒级完成。
小结
自动化这类"平台任务"时,先把三件事问清楚:
- 任务的成功标准是谁判定的(人看、平台检测、还是资源状态);
- 页面有没有遮罩层,元素是否在视口内;
- 是否需要隔离身份,以及依赖的外部服务在这个网络里是否可达。
这三条想清楚,比多写几百行选择器有用得多。
- 点赞
- 收藏
- 关注作者
评论(0)