Возвращаемое значение ячейки в таблице - C# - селен Webdriver - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь l oop над таблицей, если в столбце Id есть idNumber, затем найти столбец результата, и если он соответствует «Accept», вернуть true
Я застрял здесь - мой код. Первая строка - заголовок и столбец Id имеет значение «D-19», а результат столбца должен иметь значение «Accept»

     public string  ResultsTable()
    {


        var tableElement = Browsers.getDriver.FindElement(By.Id("datatable"));
        var trElementList = tableElement.FindElements(By.TagName("tr"));
        var tdElementList = tableElement.FindElements(By.TagName("td"));
        /// var thElementList = tableElement.FindElements(By.TagName("th"));

        var columnIndex = -1;
        var ColumnConter = 1;
        const string desiredColumnHeader = "Result";
        const string desiredValue = "Accept";


        const string manuScrptId = "D-19";

        for (int tr = 0; tr <= trElementList.Count; tr++)
        {
            var row = trElementList[tr];

            IList<IWebElement> allCellsInRow = row.FindElements((By.XPath("./*")));
            foreach (var cell in allCellsInRow)
            {
                if (cell.Text== desiredColumnHeader)
                {
                    columnIndex = ColumnConter;

                }

                if (cell.Text == desiredValue)
                {

                }

                ColumnConter++;

            }



        }

1 Ответ

0 голосов
/ 15 апреля 2020

Я предполагаю, что ваша структура таблицы будет оставаться неизменной при каждом использовании и будет использовать индексы столбцов для доступа к правильным столбцам, а не запрашивать заголовки таблиц для их поиска. Если я ошибаюсь, пожалуйста, дайте мне знать, и я обновлю свой ответ.

В большинстве таблиц будет tbody, который не содержит информацию заголовка и будет содержать только строки. Сначала я ищу это, а затем нахожу строки.

Затем я перебираю эти найденные строки oop, пока не наткнусь на строку с нужным идентификатором рукописи, а затем проверю на соответствие столбцу «Результат». и вернуть логическое значение его состояния.

using System.Collections.ObjectModel;

public string ResultsTable()
     {    
          IWebElement tableElement = Browsers.FindElement(By.CssSelector("#datatable tbody"));
          ReadOnlyCollection<IWebElement> tableRows = tableElement.FindElements(By.TagName("tr"));

          // These are assumed values and need to be updated by you
          int idColumnIndex = 0;
          int resultColumnIndex = 5;

          const string desiredValue = "Accept";
          const string manuScrptId = "D-19";

          foreach (var row in tableRows)
          {
              ReadOnlyCollection<IWebElement> rowCells = row.FindElements(By.TagName("td"));

              if (rowCells[idColumnIndex].Text.Equals(manuScrptId))
              {
                  if (rowCells[resultColumnIndex].Text.Equals(desiredValue))
                  {
                      return true.ToString();
                  }
                  else
                  {
                      return false.ToString();
                  }
              }
          }

          return false.ToString();
        }
  • Внесены изменения для возврата строки вместо bool. Если вы не хотите, чтобы "false" возвращалось, когда нужное значение не найдено, вы можете вместо этого возвратить null.

Если нет необходимости каждый раз получать заголовки столбцов, тогда это должно работа:

using System.Collections.Generic;
using System.Collections.ObjectModel;

public string ResultsTable()
     {
          IWebDriver Browsers = new ChromeDriver();

          Dictionary<string, int> columnHeaders = new Dictionary<string, int>();
          IWebElement tableElement = Browsers.FindElement(By.CssSelector("#datatable"));
          ReadOnlyCollection<IWebElement> tableRows = tableElement.FindElements(By.TagName("tr"));

          bool getColumnHeaders = true;
          const string desiredValue = "Accept";
          const string manuScrptId = "D-19";

          foreach (var row in tableRows)
          {
              if (getColumnHeaders)
              {
                  columnHeaders = GetHeaders(row);

                  getColumnHeaders = false;
              }
              else
              {
                  ReadOnlyCollection<IWebElement> rowCells = row.FindElements(By.TagName("td"));

                  if (rowCells[columnHeaders["Id"]].Text.Equals(manuScrptId))
                  {
                      if (rowCells[columnHeaders["Result"]].Text.Equals(desiredValue))
                      {
                          return true.ToString();
                      }
                      else
                      {
                          return null;
                      }
                  }
              }
          }

          return null;
        }

private Dictionary<string, int> GetHeaders(IWebElement headerRow)
     {
          Dictionary<string, int> columnHeaders = new Dictionary<string, int>();

          int counter = 0;

          ReadOnlyCollection<IWebElement> rowCells = headerRow.FindElements(By.TagName("td"));

          foreach(var cell in rowCells)
          {
              columnHeaders[cell.Text] = counter;

              counter += 1;
          }

          return columnHeaders;
      }
  • Где вы видите

rowCells [columnHeaders ["Id"]]. Text.Equals (manuScrptId) rowCells [columnHeaders ["Result"] ] .Text.Equals (requiredValue)

Вам нужно, чтобы «Id» и «Result» соответствовали фактическому желаемому тексту заголовка столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...