如何在 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;
        }

    }
  }
}