Xamarin.UITest定位微软登录页元素失败及ADAL v5.2.0 iOS适配问题
解决Xamarin.UITest + ADAL v5.2.0在iOS上无法定位微软登录元素的问题
根据你描述的两个问题,我之前在项目里也遇到过类似的情况,核心原因是ADAL v5.x在iOS上的WebView实现和v3.x有很大区别,再加上Xamarin.UITest对系统级浏览器组件的支持限制。下面分点给出具体的排查和解决办法:
问题1:iOS上无法找到登录屏幕元素(Android正常)
ADAL v5.x默认在iOS上使用SFSafariViewController(系统自带的浏览器控件)来处理登录流程,而不是v3.x里的嵌入式WebView。Xamarin.UITest默认无法直接访问SFSafariViewController内的DOM元素,因为它不属于应用内的WebView上下文;而Android端ADAL v5.x依然使用应用内WebView,所以UITest可以正常定位元素。
解决办法:
- 切换到嵌入式WebView:在初始化ADAL的
AuthenticationContext时,配置使用嵌入式WebView,这样UITest就能像v3.x版本一样直接定位元素:var authContext = new AuthenticationContext(authority); var platformParams = new PlatformParameters(UIApplication.SharedApplication.KeyWindow.RootViewController, useEmbeddedWebView: true); var result = await authContext.AcquireTokenAsync(resource, clientId, redirectUri, platformParams); - 通过JavaScript定位元素:如果必须使用SFSafariViewController,可以借助UITest的
ExecuteJavaScript方法直接操作DOM来定位和交互元素:// 输入用户名 app.ExecuteJavaScript("document.getElementById('i0116').value = 'your-username'"); // 点击下一步按钮 app.ExecuteJavaScript("document.getElementById('idSIButton9').click()");
问题2:使用Repl()命令检查元素时报错
这个问题同样和SFSafariViewController有关——Repl工具无法正确注入调试脚本到系统级的浏览器控件中,所以无法捕获和显示其中的元素。而ADAL v3.x使用的嵌入式WebView属于应用上下文,Repl可以正常处理。
解决办法:
- 优先切换到嵌入式WebView:按照问题1里的配置修改后,Repl应该能正常识别WebView,你可以继续用它来调试元素定位。
- 用JavaScript代替Repl调试:如果无法切换WebView类型,在测试代码中执行JavaScript来打印DOM结构,以此来获取元素的ID或选择器:
然后从输出的HTML里找到你需要的元素标识符,再编写对应的测试代码。// 打印登录页面的HTML结构到控制台 var html = app.ExecuteJavaScript("document.documentElement.outerHTML").ToString(); Console.WriteLine(html);
额外建议
- 升级Xamarin.UITest版本:确保你使用的是最新稳定版的Xamarin.UITest,旧版本可能对ADAL v5.x的iOS支持存在兼容性问题。
- 检查iOS应用配置:确认你的iOS应用Info.plist中已开启WebView调试支持(如果使用嵌入式WebView),添加以下配置:
(注:如果仅访问HTTPS的微软登录页面,这个配置可能不是必须的,但调试时开启可以避免一些潜在问题)<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
内容的提问来源于stack exchange,提问作者Alok Kumar Tyagi
相关产品推荐
相关产品推荐

