WinAppDriver自动化测试:无法与Telerik RadComboBox持续交互超1秒
解决方案
1. 直接定位下拉触发按钮并等待下拉列表加载
Telerik RadComboBox的下拉按钮通常有独立的自动化标识,优先定位该按钮而非整个ComboBox控件,避免误触发双击或状态异常:
using OpenQA.Selenium.Appium.Windows; using OpenQA.Selenium.Support.UI; using System.Threading; // 定位RadComboBox的下拉触发按钮(需根据实际控件AutomationId调整,通常包含"DropDownButton") WindowsElement dropDownButton = myWindowsDriver.FindElementByAccessibilityId("ComboTitle_DropDownButton"); dropDownButton.Click(); // 显式等待下拉列表项加载完成,等待时间可根据实际情况调整 var wait = new WebDriverWait(myWindowsDriver, TimeSpan.FromSeconds(2)); var dropdownItems = wait.Until(driver => driver.FindElementsByClassName("RadComboBoxItem")); // 选择目标选项"Ar" foreach (var item in dropdownItems) { if (item.Text.Equals("Ar")) { item.Click(); break; } }
2. 拆分操作步骤并增加间隔
避免连续的点击+输入操作,拆分步骤并加入短时间等待,给控件足够的状态切换时间:
WindowsElement myRadComboBox = myWindowsDriver.FindElementByAccessibilityId("ComboBox_Automation_Id"); // 先点击激活控件 myRadComboBox.Click(); Thread.Sleep(500); // 等待控件进入可交互状态 // 清空原有内容(仅适用于可编辑模式) myRadComboBox.Clear(); Thread.Sleep(300); // 发送按键 myRadComboBox.SendKeys("Ar");
3. 使用WinAppDriver原生控件模式操作
利用Windows自动化的ExpandCollapsePattern控制下拉列表展开,比模拟点击更稳定:
WindowsElement myRadComboBox = myWindowsDriver.FindElementByAccessibilityId("ComboBox_Automation_Id"); // 获取控件的展开折叠状态 var collapseState = myRadComboBox.GetAttribute("ExpandCollapsePattern.ExpandCollapseState"); if (collapseState == "Collapsed") { // 执行展开操作 myRadComboBox.ExecuteScript("arguments[0].Expand()", myRadComboBox); } // 等待目标选项出现后点击 var wait = new WebDriverWait(myWindowsDriver, TimeSpan.FromSeconds(2)); var targetItem = wait.Until(driver => driver.FindElementByName("Ar")); targetItem.Click();
4. 排查SelectionChanged事件干扰
检查ComboTitle_SelectionChanged事件的实现逻辑,是否存在自动重置选中项或快速切换状态的代码。测试时可临时注释该事件绑定,验证是否是事件导致下拉列表自动关闭:
<!-- 临时注释SelectionChanged事件 --> <Controls:RadComboBox x:Name="ComboTitle" DisplayMode="{Binding DisplayModeIdentiteBloc}" Height="20" Grid.Row="1" Grid.Column="1" SelectedValue="{Binding Path=ParentEntity.Individuals, ValidatesOnDataErrors=true}" ItemsSource="{Binding TitleLookup}" DisplayMemberPath="Value" SelectedValuePath="Key" <!-- SelectionChanged="ComboTitle_SelectionChanged" --> IsAdornable="True"/>
5. 显式配置控件自动化属性
在XAML中给RadComboBox的选项设置统一的AutomationId,方便测试代码精准定位:
<Controls:RadComboBox x:Name="ComboTitle" AutomationId="ComboTitle_Main" DisplayMode="{Binding DisplayModeIdentiteBloc}" Height="20" Grid.Row="1" Grid.Column="1" SelectedValue="{Binding Path=ParentEntity.Individuals, ValidatesOnDataErrors=true}" ItemsSource="{Binding TitleLookup}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectionChanged="ComboTitle_SelectionChanged" IsAdornable="True"> <Controls:RadComboBox.ItemContainerStyle> <Style TargetType="Controls:RadComboBoxItem"> <Setter Property="AutomationId" Value="{Binding Key}"/> </Style> </Controls:RadComboBox.ItemContainerStyle> </Controls:RadComboBox>
之后可直接通过AutomationId定位选项:
// 展开下拉列表后直接定位目标选项 WindowsElement targetItem = myWindowsDriver.FindElementByAccessibilityId("Ar"); targetItem.Click();
内容的提问来源于stack exchange,提问作者Chictabac
相关产品推荐
相关产品推荐

