Есть заказчики. Под каждым заказчиком отображается информация о заказе. Элементов может быть разное количество - может 1, а может и 10. Каким образом можно получить значения столбца Amount для строк с выбранным чекбоксом.
Для выбора чекбокса используется следующий селектор
Идея следующая - определить количество строк (клиентов), сгенерировать рандомное число в пределах и его использовать для выбора галочки и получения списка заказов.
Получение числа клиентов
private int getNumberRow()
{
IList<IWebElement> webElement = new List<IWebElement>();
webElement = Driver.FindElements(By.XPath("//*[@id='ProductTable']/.//td[8]"));
int i = new Random().Next(webElement.Count);
return i;
}
Клик на рандомного клиента
public IWebElement clickToCheckbox()
{
int i = getNumberRow()+1;
IWebElement clickToCustomer = Driver.FindElement(By.XPath(".//*[@id='ProductTable']/.//tr[" + i + "]/.//td[9]/input"));
clickToCustomer.Click();
return clickToCustomer;
}
Вылучение всех заказов выбранного клиента
public void getTotalAmount()
{
//IWebElement customer = clickToCheckbox();
//checkbox = customer.FindElements(By.XPath(".//*[@id='ProductTable']/.//input"));
IList<IWebElement> checkbox = new List<IWebElement>();
checkbox = Driver.FindElements(By.XPath(".//*[@id='ProductTable']/.//td[9]/input"));
var amount = 0.0;
foreach (IWebElement webElement in checkbox)
{
if (webElement.Selected)
{
IWebElement amountRow = Driver.FindElement(By.XPath(".//*[@id='ProductTable']/.//tr[3]/td[2]"));
try
{
amount += Convert.ToDouble(amountRow.Text);
}
catch
{
throw new Exception();
}
}
}
}
Проблема первая - я определяю количество клиентов по ячейке №8, которая есть только у клиентов. В подстроках с заказами такой ячейки нет. Тут все супер. Когда я пытаюсь кликнуть на клиента с полученным числом оно уже смотрит на все строки и стественно падает с ошибкой, ибо такой ячейки нет. Как мне при попытке клика смотреть только на строки с киентами, а не с заказами?
Проблема вторая - в последнем методе я хотел искать внутри выбранного клиента его заказы. Для этого передавал в метод вебэлемент. Но при этом вызывался заново метода клика и ставилась вторая галочка и дальше все работало не верно. Как осуществить поиск у уже выбранного клиента?
private int getNumberRow()
{
IList<IWebElement> webElement = new List<IWebElement>();
webElement = Driver.FindElements(By.XPath("//*[@id='ProductTable']/.//td[8]"));
int i = new Random().Next(webElement.Count);
return i;
}
Вот тут я получал количество клиентов и кликал на радномного из них.
Напишу еще раз…
Ты кликаешь на чекбокс второго покупателя, как ты понял что тебе нужно кликнуть именно на него?
Тебе нужно всегда кликать только на второго или ты смотришь на какой-то определнный номер заказа или номер еще чего либо?
public void clickToCheckbox()
{
int i = getNumberCustomers();
var customers = Driver.FindElements(By.XPath("//*[@id='ProductTable']/.//td[9]"));
foreach(IWebElement webElement in customers)
{
if (webElement.FindElement(By.XPath(".//*[@id='ProductTable']/.//tr[" + i + "]/td[9]/input")).IsDisplayedSafe())
{
webElement.FindElement(By.XPath(".//*[@id='ProductTable']/.//tr[" + i + "]/td[9]/input")).Click();
break;
}
}
Подскажите с проблемой. Собираю лист строк. И в листе потом вижу вот такие элементы
if (webElement.FindElement(......IsDisplayedSafe()) //{Element (id = 0.4209957221595275-3)}
Думаю проблема в самом подходе
Обычно если работаешь со списком /таблицей
составляеш “карту” элементов из которых состоит таблица: элементы ячейки, ячейки(контейнеры), столбцы итд
потом создается метод “получить список” например столбцов
потом создается метод “получить список ячеек” в столбце
потом создается метод “получить ячейку” по индексу иоли какой-то другой информации например - тексту
Собственно тест выглядит так
найти ячейку по параметрам
совершить действия
проверить данные ячейки
Естественно каждый шаг проверяется в дебаге
А результат контролируется референсными и как правило статичными данными(рандом тестинг апроч тоже есть - но это больше к юнит тестированию)
Тест это доказательство работы какого-то фунционала
если честно я вообще не понимаю зачем вы делаете то что делаете
С тем же успехом можно всегда кликать в первый ряд и проверять что там будет
public double getTable()
{
var table = Driver.FindElement(By.Id("ProductTable"));//получаю всю таблицу
var row = table.FindElements(By.CssSelector("input.productSelect:checked[type='checkbox']")); //ищу в таблице выбранные чекбоксы
double amount = 0.0;
foreach (IWebElement webElement in row)
{
try
{
amount += double.Parse(Driver.FindElement(By.XPath(".//*[@class='even-row']/.//td[2]")).Text);
/*Если делать вот так то находит 4 строки и 4 раза прибавляет первый элемент 803.52*/
amount += double.Parse(webElement.FindElement(By.CssSelector("td.right-align")).Text);
/*Если делать вот так, то 4 раза берет заголовок столбца GBP*/
}
catch
{
//amount += double.Parse(Driver.FindElement(By.XPath(".//*[@class='odd-row']/.//td[2]")).Text);
}
}
return amount;
}