我正在尝试使用winappdriver从WPF项目的GridView中获取单元格值。
我对这条线有一个问题:
string name = row.FindElementByName("Name1").Text;
使用给定的搜索参数无法在页面上定位元素。
请检查我的以下代码:
<Grid>
<ListView Margin="10" Name="lvUsers" AutomationProperties.AutomationId="lvUsers">
<ListView.View>
<GridView x:Name="ListViewItem" AutomationProperties.AutomationId="ListViewItem">
<GridViewColumn x:Name="Name1" AutomationProperties.Name="Name1" AutomationProperties.AutomationId="Name1" Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
<GridViewColumn Header="Mail" Width="150" DisplayMemberBinding="{Binding Mail}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
var listBox = session.FindElementByAccessibilityId("lvUsers");
var comboBoxItems = listBox.FindElementsByClassName("ListViewItem");
foreach (var row in comboBoxItems)
{
string name = row.FindElementByName("Name1").Text;
if (name == "John Doe")
{
findName = true;
break;
}
}
Assert.AreEqual(findName, true);
3条答案
按热度按时间rqqzpn5f1#
很明显,您选择了错误的工具来完成任务。自动化设计用于处理UI元素,但您需要数据来完成任务。请查看DataGrid的可视化树是什么样子:
DataGrid继承自ItemsControl。在他的可视化中只有行。没有列。可以从特定单元格中提取数据,但这非常困难,没有意义。
您需要创建一个普通的数据源。要开始,请使用INotifyPropertyChanged的某种实现。例如:
在此基础上,您可以创建集合元素的类型:
和带有集合的ViewModel:
将其连接到DataContext窗口:
现在,您的任务简化为在People集合中查找所需的项目。
nafvub8i2#
如果你知道单元格在网格中的确切位置(例如x行,y列),请使用以下自定义代码。
它对我起作用了,我必须得到第3行第2列的数字。网格有6列。
下面是函数定义。(虽然不是一个完美的代码)
我也必须得到最大的数字。所以,我做了以下事情。
w46czmvw3#
使用inspect.exe(与WinAppDriver一起下载),我发现在DataGridView中可以访问DataGridView的每个单元格中的文本,如下所示
其中ColumnName是列的名称,x是行号(从0开始)
但是,我发现上面的方法非常慢,一种更快的方法是定位DataGridView,然后使用XPath定位它的所有元素(单元格),如下所示