如何在 C# 中找到正确的用户名后单击数据网格中的按钮
How to Click on a Button within a datagrid after finding the correct username in C#
所以这是我的代码,它能够获取数据网格列的 header 并从用户输入中找到匹配的值。例如,如果输入是 "jdoe",它将查看数据网格中的用户名列并将 [value.Key].Text 匹配到 value.Value。现在的问题是每一行都有一个具有相同自动化 ID 的 "Edit" 按钮。无论 "jdoe" 位于哪一行,我如何遍历数据网格并能够单击“编辑”按钮:
这是我目前所拥有的:
public static bool Contains(this ListView listView, ObjectInList objectInList)
{
foreach (ListViewRow row in listView.Rows)
{
if (DataMatches(row, objectInList))
return true;
}
return false;
}
private static bool DataMatches(ListViewRow row, ObjectInList objectInList)
{
foreach (KeyValuePair<string, string> value in objectInList.Values)
{
if (row.Cells[value.Key].Text != value.Value)
return false;
}
return true;
}
}
internal class UserInList : ObjectInList
{
public UserInList(string username)
{
_values["Username"] = username;
}
}
internal class OrderInList : ObjectInList
{
public OrderInList(string orderNumber)
{
_values["Depot Tag #"] = orderNumber;
}
}
internal abstract class ObjectInList
{
protected readonly Dictionary<string, string> _values = new Dictionary<string, string>();
public IReadOnlyDictionary<string, string> Values
{
get { return _values; }
}
This is a screenshot of the WPF application
一个可能的解决方案是使用 xpath 找到包含您的文本的单元格的行,并从那里到 select 按钮。
示例:
//tr[.//td[text()='jdoe']]//button
这是我用来遍历 tables 的方法:
获取您的搜索元素 = value2
获取您的 table id、xpath 或 css = myTable
循环将遍历 table,然后找到 value2。从这里您可以选择下一步要做什么。假设您的专栏如下所示:
|col 1 |col 2 | col 3 |
|link1 | value1 | link2 |
|link1 | value2 | link2 |
在下面它将停止在值 2 上。那变成了 tds[i]。要单击 link 1 我使用:
tds[i - 1].Click();
如果我想点击 link 2 我使用:
tds[i + 1].Click();
只需考虑 [i] 中的列号并向左(减)或向右(加)数列数。
public void ClickTableLink(String value2)
{
var table = driver.FindElement(By.Id("myTable"));
foreach (var tr in table.FindElements(By.TagName("tr")))
{
var tds = tr.FindElements(By.TagName("td"));
for (var i = 0; i < tds.Count; i++)
{
if (tds[i].Text.Trim().Contains(value2))
{
tds[i - 1].Click();
break;
}
}
}
}
所以这是我的代码,它能够获取数据网格列的 header 并从用户输入中找到匹配的值。例如,如果输入是 "jdoe",它将查看数据网格中的用户名列并将 [value.Key].Text 匹配到 value.Value。现在的问题是每一行都有一个具有相同自动化 ID 的 "Edit" 按钮。无论 "jdoe" 位于哪一行,我如何遍历数据网格并能够单击“编辑”按钮: 这是我目前所拥有的:
public static bool Contains(this ListView listView, ObjectInList objectInList)
{
foreach (ListViewRow row in listView.Rows)
{
if (DataMatches(row, objectInList))
return true;
}
return false;
}
private static bool DataMatches(ListViewRow row, ObjectInList objectInList)
{
foreach (KeyValuePair<string, string> value in objectInList.Values)
{
if (row.Cells[value.Key].Text != value.Value)
return false;
}
return true;
}
}
internal class UserInList : ObjectInList
{
public UserInList(string username)
{
_values["Username"] = username;
}
}
internal class OrderInList : ObjectInList
{
public OrderInList(string orderNumber)
{
_values["Depot Tag #"] = orderNumber;
}
}
internal abstract class ObjectInList
{
protected readonly Dictionary<string, string> _values = new Dictionary<string, string>();
public IReadOnlyDictionary<string, string> Values
{
get { return _values; }
}
This is a screenshot of the WPF application
一个可能的解决方案是使用 xpath 找到包含您的文本的单元格的行,并从那里到 select 按钮。
示例:
//tr[.//td[text()='jdoe']]//button
这是我用来遍历 tables 的方法:
获取您的搜索元素 = value2
获取您的 table id、xpath 或 css = myTable
循环将遍历 table,然后找到 value2。从这里您可以选择下一步要做什么。假设您的专栏如下所示:
|col 1 |col 2 | col 3 |
|link1 | value1 | link2 |
|link1 | value2 | link2 |
在下面它将停止在值 2 上。那变成了 tds[i]。要单击 link 1 我使用:
tds[i - 1].Click();
如果我想点击 link 2 我使用:
tds[i + 1].Click();
只需考虑 [i] 中的列号并向左(减)或向右(加)数列数。
public void ClickTableLink(String value2)
{
var table = driver.FindElement(By.Id("myTable"));
foreach (var tr in table.FindElements(By.TagName("tr")))
{
var tds = tr.FindElements(By.TagName("td"));
for (var i = 0; i < tds.Count; i++)
{
if (tds[i].Text.Trim().Contains(value2))
{
tds[i - 1].Click();
break;
}
}
}
}