CodeceptJS结合Appium实现UAT环境移动端Chrome basic auth配置问题
你当前配置的basicAuth参数不生效的核心原因是:CodeceptJS Appium helper的内置basicAuth配置仅适配原生应用的请求拦截场景,对Android端Chrome浏览器的网页场景不支持。Chrome for Android从80版本开始也默认拦截了URL拼接凭证的访问方式,所以你之前的尝试都会失败。
以下是两种可行的解决方案:
解决方案1:通过Chrome DevTools协议注入Authorization头(优先推荐)
该方案稳定性最高,不依赖Chrome界面元素变更。
第一步:调整Appium配置
在你现有的Appium配置中补充desiredCapabilities配置段:
exports.config = { output: './output', helpers: { Appium: { path: '/wd/hub', port: 4723, platform: 'Android', browserName: 'Chrome', url: 'https://test.co.uk/', show: true, // 新增以下配置 desiredCapabilities: { 'goog:chromeOptions': { args: ['--disable-web-security', '--allow-running-insecure-content'] } } } } }
第二步:在测试前置钩子中添加请求拦截逻辑
在测试套件的Before钩子或单条用例开头加入以下代码,自动给所有请求加上Basic Auth头:
Before(async () => { const cdpSession = await I.grabCDPSession(); // 开启目标域名的请求拦截 await cdpSession.send('Fetch.enable', { patterns: [{ urlPattern: 'https://test.co.uk/*' }] }); // 拦截请求并注入Auth头 cdpSession.on('Fetch.requestPaused', async (event) => { const authHeader = `Basic ${Buffer.from('user:pass').toString('base64')}`; const modifiedHeaders = [ ...Object.entries(event.request.headers).map(([name, value]) => ({ name, value })), { name: 'Authorization', value: authHeader } ]; await cdpSession.send('Fetch.continueRequest', { requestId: event.requestId, headers: modifiedHeaders }); }); });
解决方案2:自动填充Basic Auth原生弹窗
如果CDP方案无法使用,可通过识别Chrome的Basic Auth弹窗元素自动填充,适合临时调试场景:
// 打开目标页面后执行以下步骤 I.waitFor(5); // 输入用户名 I.fillField('//android.widget.EditText[@resource-id="com.android.chrome:id/username"]', 'user'); // 输入密码 I.fillField('//android.widget.EditText[@resource-id="com.android.chrome:id/password"]', 'pass'); // 点击确认按钮 I.click('//android.widget.Button[@resource-id="com.android.chrome:id/positive_button"]');
注意:该方案依赖Chrome版本的元素资源ID,不同版本Chrome的ID可能存在差异,需要根据你测试用的Chrome版本调整定位表达式
内容的提问来源于stack exchange,提问作者redoptics
相关产品推荐
相关产品推荐

