You need to enable JavaScript to run this app. 使用wd库进行iOS自动化测试时点击登录按钮应用卡住怎么办
优惠活动
大模型
产品
解决方案
定价
更多

使用wd库进行iOS自动化测试时点击登录按钮应用卡住怎么办

问题根因&解决方案

你遇到的是XCUITest自动化输入场景下的常见问题,核心是自动化操作的行为和人工操作存在差异,触发了应用的输入校验或者系统的交互拦截,可按以下方案逐一排查修复:

  • 输入完成后主动触发输入框失焦
    人工输入完成后会自然触发输入框失焦,很多应用的输入合法性校验逻辑只会在失焦时执行,自动化脚本直接输入后立即点击登录,输入校验还没执行就发起登录请求会导致逻辑异常。
    在所有输入完成后添加隐藏键盘的逻辑即可:
    await driver.hideKeyboard()
    如果hideKeyboard不生效,也可以点击页面空白区域强制失焦。

  • 校验输入内容准确性
    wd的sendKeys方法对iOS安全输入框偶发丢字符问题,可在输入完成后获取输入框属性确认内容和预期一致:

// 示例:校验URL输入是否正确
const actualUrl = await el1.getAttribute('value')
if (actualUrl !== 'http://example.com/login') {
  await el1.clear()
  await el1.sendKeys('http://example.com/login')
}
  • 调整按钮点击逻辑
    XCUITest原生click方法对部分自定义UIButton的点击识别存在异常,可替换为坐标点击实现:
const loginBtnRect = await el4.getRect()
// 点击按钮中心坐标
await driver.tap({
  x: loginBtnRect.x + loginBtnRect.width / 2,
  y: loginBtnRect.y + loginBtnRect.height / 2
})
  • 模拟人工输入节奏
    部分应用做了防机器校验,脚本输入速度远快于人工会被拦截,可在各输入步骤之间添加短延迟:
    await driver.sleep(500)

修复后参考代码

// Requires the admc/wd client library
// (npm install wd)
// Then paste this into a .js file and run with Node 7.6+

const wd = require('wd');
const driver = wd.promiseChainRemote("http://localhost:4723/wd/hub");
const caps = {"platformName":"iOS","deviceName":"iPad Pro (9.7-inch)","automationName":"XCUITest","uuid":"E85ADF43-A1D0-472D-909A-B90E11767266","app":"/Users/user/Documents/GIT/B52/build/Release-iphonesimulator/B52FloorManagement.app"};

async function main () {
  await driver.init(caps);
  // 输入基础URL
  let el1 = await driver.elementByXPath("//XCUIElementTypeTextField[@name=\"baseURLEntry\"]");
  await el1.clear()
  await el1.sendKeys("http://example.com/login");
  await driver.sleep(300)
  // 输入用户名
  let el2 = await driver.elementByXPath("//XCUIElementTypeTextField[@name=\"userNameEntry\"]");
  await el2.clear()
  await el2.sendKeys("XXXXXXXX");
  await driver.sleep(300)
  // 输入密码
  let el3 = await driver.elementByXPath("//XCUIElementTypeSecureTextField[@name=\"passwordEntry\"]");
  await el3.clear()
  await el3.sendKeys("XXXXXXX");
  await driver.sleep(300)
  // 隐藏键盘触发失焦校验
  await driver.hideKeyboard()
  await driver.sleep(500)
  // 点击登录按钮
  let el4 = await driver.elementByAccessibilityId("loginButton");
  const btnRect = await el4.getRect()
  await driver.tap({x: btnRect.x + btnRect.width/2, y: btnRect.y + btnRect.height/2})
  // 等待登录跳转完成再退出
  await driver.sleep(3000)
  await driver.quit();
}

main().catch(console.log);

内容的提问来源于stack exchange,提问作者Worik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 14:06:02