使用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
相关产品推荐
相关产品推荐

