Как получить значения из подстроки таблицы

Добрый день.

Помогите пожалуйста. Имеется таблица следующего вида.


Есть заказчики. Под каждым заказчиком отображается информация о заказе. Элементов может быть разное количество - может 1, а может и 10. Каким образом можно получить значения столбца Amount для строк с выбранным чекбоксом.

Для выбора чекбокса используется следующий селектор

.//*[@id='ProductTable']/.//tr[3]/.//input

Для получения первого значения

.//*[@id='ProductTable']/.//tr[3]/td[2] ///возвращает 803,52

Но как получить все значения с выбранным чекбоксом пока понять не могу.

findElements, затем рекурсивно по коллекции проходитесь и вытягиваете что надо

Я бы достал номер галки, по этому номеру уже доставал данные из других столбцов.

1 лайк

Идея следующая - определить количество строк (клиентов), сгенерировать рандомное число в пределах и его использовать для выбора галочки и получения списка заказов.
Получение числа клиентов

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, которая есть только у клиентов. В подстроках с заказами такой ячейки нет. Тут все супер. Когда я пытаюсь кликнуть на клиента с полученным числом оно уже смотрит на все строки и стественно падает с ошибкой, ибо такой ячейки нет. Как мне при попытке клика смотреть только на строки с киентами, а не с заказами?


Проблема вторая - в последнем методе я хотел искать внутри выбранного клиента его заказы. Для этого передавал в метод вебэлемент. Но при этом вызывался заново метода клика и ставилась вторая галочка и дальше все работало не верно. Как осуществить поиск у уже выбранного клиента?

Напиши нормаьлно что конкретно тебе достать нужно и скинь текстом ДОМ таблицы

Необходимо кликнуть на клиента (на скрине кликнул руками). Далее получить сумму заказов этого клиента (в данном примере 2,91)

Сводка
<div id="ProductTable">
    <table class="grid grid-table" data-oo-class="grid-table" summary="table-content">
	<tbody><tr>
		<th>
			<div class="grid-column-holder-no-float">Organisation</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Account Name</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Customer Name</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Enquiry Number</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Sales Order Number</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Customer Reference</div>
		</th>
		<th class="right-align">
			<div class="grid-column-holder-no-float">Amount</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Product</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float no-wrap">
				<input type="checkbox" id="SelectAll">
				<span class="smallnotification smallnotification-amber-exclamation" id="SelectAllWarning" title="Some products have not been selected to invoice.">&nbsp;</span>
			</div>
		</th>
		<th>
			<div class="grid-column-holder-no-float">Actions</div>
		</th>
	</tr>
		<tr class="row-divider odd-row">
			<td>AIG Group</td>
			<td>AR_Stationery (GBP)</td>
			<td>AIG Europe Limited</td>
			<td>E02446684</td>
			<td>UKSO2121585</td>
			<td>39000199</td>
			<td class="right-align">GBP</td>
			<td>&nbsp;</td>
			<td class="no-wrap">
				<input type="checkbox" class="productSelect" data-order="UKSO2121585" name="orderlineid" value="811443">
			</td>
			<td>
				<a href="/Enquiries/SalesOrderReview?enquiryId=475222&amp;salesOrderId=600355" class="largeicon largeicon-details">&nbsp;</a>
			</td>
		</tr>
			<tr class="odd-row">
				<td colspan="6">&nbsp;</td>
				<td class="right-align">2,538.45</td>
				<td> A&amp;H Comm Sales Logistics - March 19</td>
				<td>
				</td>
				<td>&nbsp;</td>
		</tr>
		<tr class="row-divider even-row row-separator">
			<td>AIG Group</td>
			<td>AR_Stationery (GBP)</td>
			<td>AIG Europe Limited</td>
			<td>E02447017</td>
			<td>UKSO2121638</td>
			<td>39000204</td>
			<td class="right-align">GBP</td>
			<td>&nbsp;</td>
			<td class="no-wrap">
				<input type="checkbox" class="productSelect" data-order="UKSO2121638" name="orderlineid" value="811935">
			</td>
			<td>
				<a href="/Enquiries/SalesOrderReview?enquiryId=475550&amp;salesOrderId=600762" class="largeicon largeicon-details">&nbsp;</a>
			</td>
		</tr>
			<tr class="even-row">
				<td colspan="6">&nbsp;</td>
				<td class="right-align">2.91</td>
				<td>PCG Logistics - March 19</td>
				<td>
				</td>
				<td>&nbsp;</td>
		</tr>
		<tr class="row-divider odd-row row-separator">
			<td>AIG Group</td>
			<td>AR_Stationery (GBP)</td>
			<td>AIG Europe Limited</td>
			<td>E02447026</td>
			<td>UKSO2121779</td>
			<td>39000201</td>
			<td class="right-align">GBP</td>
			<td>&nbsp;</td>
			<td class="no-wrap">
				<input type="checkbox" class="productSelect" data-order="UKSO2121779" name="orderlineid" value="812705">
			</td>
			<td>
				<a href="/Enquiries/SalesOrderReview?enquiryId=475559&amp;salesOrderId=601386" class="largeicon largeicon-details">&nbsp;</a>
			</td>
		</tr>
			<tr class="odd-row">
				<td colspan="6">&nbsp;</td>
				<td class="right-align">290.53</td>
				<td>A&amp;H Travel Logistics - March 19</td>
				<td>
				</td>
				<td>&nbsp;</td>
		</tr>
		<tr class="row-divider even-row row-separator">
			<td>AIG Group</td>
			<td>AR_Stationery (GBP)</td>
			<td>AIG Europe Limited</td>
			<td>E02447461</td>
			<td>UKSO2121786</td>
			<td>39000221</td>
			<td class="right-align">GBP</td>
			<td>&nbsp;</td>
			<td class="no-wrap">
				<input type="checkbox" class="productSelect" data-order="UKSO2121786" name="orderlineid" value="812733">
			</td>
			<td>
				<a href="/Enquiries/SalesOrderReview?enquiryId=475994&amp;salesOrderId=601414" class="largeicon largeicon-details">&nbsp;</a>
			</td>
		</tr>
			<tr class="even-row">
				<td colspan="6">&nbsp;</td>
				<td class="right-align">111.23</td>
				<td>Corporate Stationery Logistics - March 19 *STORAGE* </td>
				<td>
				</td>
				<td>&nbsp;</td>
		</tr>
		<tr class="row-divider odd-row row-separator">
			<td>AIG Group</td>
			<td>AR_Stationery (GBP)</td>
			<td>AIG Europe Limited</td>
			<td>E02447461</td>
			<td>UKSO2121787</td>
			<td>39000220</td>
			<td class="right-align">GBP</td>
			<td>&nbsp;</td>
			<td class="no-wrap">
				<input type="checkbox" class="productSelect" data-order="UKSO2121787" name="orderlineid" value="812734">
			</td>
			<td>
				<a href="/Enquiries/SalesOrderReview?enquiryId=475994&amp;salesOrderId=601415" class="largeicon largeicon-details">&nbsp;</a>
			</td>
		</tr>
			<tr class="odd-row">
				<td colspan="6">&nbsp;</td>
				<td class="right-align">111.46</td>
				<td>Corporate Stationery Logistics - March 19 *STORAGE*</td>
				<td>
				</td>
				<td>&nbsp;</td>
		</tr>

</tbody></table>

</div>

Как узнать на каокго клиента кликнуть? По индексу или по номеру какому-то или как?

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;
        }

Вот тут я получал количество клиентов и кликал на радномного из них.

Ну так в тесте как нужно? Или нужно просто кликнуть на рандомного пользователя и вытянуть рандомную цену?

1 лайк

Пример по скрину с первого поста

Напишу еще раз…
Ты кликаешь на чекбокс второго покупателя, как ты понял что тебе нужно кликнуть именно на него?
Тебе нужно всегда кликать только на второго или ты смотришь на какой-то определнный номер заказа или номер еще чего либо?

Я кликаю на рандомного клиента каждый раз. Выше показывал метод для получения случайного клиента

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;
        }

Не могу дальше додумать.