Добрый день!
Помогите, пожалуйста, с верной конфигурацией фреймворка. Речь идёт о помощнике для работы с веб таблицами. Есть код, который собирает данные с таблицы и складывает их в список для ускорения и удобства работы. Он вполне адекватно работает. Проблема в том, что он также ищет в ячейках веб элементы (ссылки, чекбоксы, поля ввода) и предопределяет набор действий для них (клик, ввод текста и т.д.) Сейчас фреймворк сконфигурирован так, что метод FindElements(By.TagName()) из метода GetControl() вызывается на каждой ячейке, для проверки последней на наличие в ней веб элементов. Это самая большая проблема, т.к. для динамических таблиц, как у меня в проекте, проверка каждой ячейки занимает 5-8 секунд, на строку из 6 колонок уходит 45-50 секунд, соответственно обработка таблицы с 10 строками занимает почти 10 минут. Возможно, есть советы, как можно переписать код, чтобы избавиться от просадки? Код:
public static void ReadTable(IWebElement table)
{
//Initialize the table
_tableDatacollections = new List <TableDatacollection>();
//Get all the columns from the table
var columns = table.FindElements(By.TagName("th"));
//Get all the rows
var rows = table.FindElements(By.TagName("tr"));
//Create row index
int rowIndex = 0;
foreach (var row in rows)
{
int colIndex = 0;
var colDatas = row.FindElements(By.TagName("td"));
//Store data only if it has value in the row
if (colDatas.Count != 0)
{
foreach (var colValue in colDatas)
{
_tableDatacollections.Add(new TableDatacollection
{
RowNumber = rowIndex,
ColumnName = columns[colIndex].Text != "" ?
columns[colIndex].Text : colIndex.ToString(),
ColumnValue = colValue.Text,
ColumnSpecialValues = GetControl(colValue)
});
//Move to next column
colIndex++;
}
}
rowIndex++;
}
}
private static ColumnSpecialValue GetControl(IWebElement columnValue)
{
ColumnSpecialValue columnSpecialValue = null;
//Check if the control has specific tags like input/hyperlink etc
if (columnValue.FindElements(By.TagName("a")).Count > 0)
{
columnSpecialValue = new ColumnSpecialValue
{
ElementCollection = columnValue.FindElements(By.TagName("a")),
ControlType = "hyperlink"
};
}
if (columnValue.FindElements(By.TagName("input")).Count > 0)
{
columnSpecialValue = new ColumnSpecialValue
{
ElementCollection = columnValue.FindElements(By.TagName("input")),
ControlType = "input"
};
}
return columnSpecialValue;
}
public class TableDatacollection
{
public int RowNumber { get; set; }
public string ColumnName { get; set; }
public string ColumnValue { get; set; }
public ColumnSpecialValue ColumnSpecialValues { get; set; }
}
public class ColumnSpecialValue
{
public IEnumerable<IWebElement> ElementCollection { get; set; }
public string ControlType { get; set; }
}
Дальше идут методы для работы с полученной таблицей, они не существенны. Просадку дают именно два if’a в методе GetControl(). Буду рад любой идее.