Проверка нескольких функций продукта, добавленных в корзину, одинакова на странице «Сводка заказа» с помощью Selenium webdriver + Specflow + шаблон объекта страницы C#+.

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

Я использую функциональность контекста сценария Specflow.

Mindwell, я хочу добиться того же, что и на этом изображении, в настоящее время у меня есть код только для 1 продукта, и я хочу сделать то же самое для нескольких продуктов.

1) Страница корзины. На этом шаге я беру все элементы страницы и принимаю их значения в контексте сценария.

введите здесь описание изображения

string productname = pdpPage.getBrandName();
pdpPage.ExpandSideBar();
pdpPage.SelectProductQuantity(Quantity);
var hp = new HeaderPage(driver);
int currentBagQuantity = hp.getBagQuantity();
decimal currentTotalBagPrice = hp.getBagTotalPrice();

ScenarioContext.Current.Add("Product Name",productname);
ScenarioContext.Current.Add("QuantityAdded", int.Parse(Quantity));
ScenarioContext.Current.Add("BagQuantity", currentBagQuantity);
ScenarioContext.Current.Add("CurrentBagPrice", currentTotalBagPrice);
ScenarioContext.Current.Add("ProductPrice", pdpPage.getProductPriceInDecimal());

2) Страница сводки заказа. На этом этапе я утверждаю значения. Это страница сводки заказа. введите здесь описание изображения

var os = new OrderSummaryPage(driver);
string brandname = os.getOrderProductName();
            int quantity = os.getOrderQuantity();
            decimal price = os.getOrderPrice();

Assert.IsTrue(brandname.Equals((string)ScenarioContext.Current["Product Name"]), "Err! Product is different!, on pdp is :" + ScenarioContext.Current["Product Name"] + "on order summary is" + brandname);
Assert.IsTrue(quantity.Equals((int)ScenarioContext.Current["QuantityAdded"]), "Err! Quantity is different from ordered!");
Assert.IsTrue(price.Equals((decimal)ScenarioContext.Current["ProductPrice"]), "Err! Product price is appearing to be different!");
Assert.IsTrue(GenericFunctions.isElementPresent(os.Delivery_Address), "Delivery Address details are not present");
Assert.IsTrue(GenericFunctions.isElementPresent(os.Billing_Address), "Billing Address details are not present!!");

Я новичок в этом деле!! Как зациклить их и получить динамический материал. Я хочу проверить и подтвердить каждый товар Название продукта, цена, количество.

Делая это :

Мой пошаговый файл:

[When(@"I check the items on basket page")]
        public void WhenICheckTheItemsOnBasketPage()
        {
            var bp = new BasketPage(driver);
            var h = bp.getLISTItemsFromOrderPage();
        for (int i = 0; i <= h.Count; i++)
        {
            ScenarioContext.Current.Add("item", h[i]);
        }
         }

BasketPage.cs

public IList getLISTItemsFromOrderPage()
        {
          List<BasketItems> orderProducts = new List<BasketItems>();
          var elements = (driver.FindElements(By.Id("basketitem")));

          foreach (IWebElement element in elements)
          {
            orderProducts.Add(CreateOrderProduct(element));
          }
          return orderProducts;
        }

public BasketItems CreateOrderProduct(IWebElement item)
                    {
                        return new BasketItems()
                       {
                           BrandName = item.FindElement(By.TagName("a")).Text.Trim(),
                           Quantity = GenericFunctions.DropDown_GetCurrentValue(item.FindElement(By.TagName("select"))),
                           Price = Convert.ToDecimal(item.FindElement(By.ClassName("col-md-2")).Text.Substring(1))
                       };
                    }

BasketItem.cs

public class BasketItems : BasketPageOR
    {
        public string BrandName { get; set; }
        public string Quantity { get; set; }
        public decimal Price { get; set; } 
    }

Пожалуйста помоги! Заранее спасибо!!


person Arpan Buch    schedule 15.12.2014    source источник
comment
Я не знаю эквивалента в С#, но в java вы можете использовать функцию getElements, чтобы получить все элементы с одним и тем же тегом. Здесь вы можете получить элементы с id=productorderitems. getElements возвращает список элементов (в java), поэтому вы можете перебирать список, чтобы выполнить нужные проверки.   -  person Vivek Singh    schedule 15.12.2014
comment
@VivekSingh: я думаю, вы попали в findElements, верно? потому что getElements не является предопределенным методом в java.. :)   -  person Subh    schedule 15.12.2014
comment
ага, извините за ошибку... просто неправильно написал... используйте foreach(IWebElement element in list), чтобы повторить это...   -  person Vivek Singh    schedule 15.12.2014


Ответы (1)


Ваш метод os.getOrderProductName(); не имеет смысла, если в заказе может быть несколько продуктов.

У вас должен быть метод os.getOrderProducts();, который будет возвращать набор объектов OrderProduct. Он должен сделать это, найдя все элементы, которые имеют id="productorderelement" (хотя у вас не должно быть элементов с одним и тем же идентификатором, вы действительно должны использовать для этого класс), а затем зациклиться на каждом элементе, извлекая информацию для создания OrderProduct что-то вроде этого позволяют получить элементы с идентификатором:

List<OrderProduct> orderProducts = new List<OrderProduct>();
var elements = (Driver.FindElements(By.XPath("//*[@id=\"productorderelement\"]")))
foreach (element in elements)
{
    orderProducts.Add(CreateOrderProduct(element));
}

public class OrderProduct
{
    public string BrandName{get;set;}
    public int Quantity{get;set;}
    public double Price{get;set;}    
}

public OrderProduct CreateOrderProduct(IWebElement element)
{
     return new OrderProduct()
     {
          BrandName= element.Something, //you need to extract the appropriate bit of the webelement that holds the brandname, quantity and price, but you don't show us the structure so I can't help there
          Quantity= element.FindElement(By.Class("quantity")).Text, //for example
          Price= element.GetAttribute("Price") //again another example
     }
}
person Sam Holder    schedule 16.12.2014
comment
хорошо .. Итак, у меня есть несколько вопросов здесь (1) что такое ‹OrderProduct› здесь и ‹orderProduct›. (2) Что будет CreateOrderProduct (элемент) ?? - person Arpan Buch; 17.12.2014
comment
OrderProduct — это класс, который вам нужно создать, который будет содержать информацию о продукте, в основном название бренда, количество и цену, и CreateOrderProduct, если метод извлекает эти значения из каждого productorderitems div и создает из него OrderProduct - person Sam Holder; 17.12.2014
comment
Это совсем не тяжело, добавлен пример. - person Sam Holder; 19.12.2014
comment
ты просто супер Сэм! Спасибо, я почти достиг того, что хотел. я перехожу к следующей части решения, держите вас в курсе!! Большое спасибо :) - person Arpan Buch; 19.12.2014
comment
Хорошо, теперь я понял, как это работает! Но у Сэма возникает еще один вопрос: как я буду утверждать такие значения, как количество, название, цена. Мне нужно будет извлечь данные из объекта - person Arpan Buch; 19.12.2014