/// <summary>
        /// Loads all products on current catalogue page using row elements
        /// </summary>
        internal void LoadProductRows()
        {
            _logger.Trace(" > Attempting to load catalogue products...");
            Thread.Sleep(2000);

            _productVariants = ProductsTable.FindElements(By.CssSelector(Constants.ProductPage.XP.ALL_PROD_VARIANTS));
            _productQtyUp = ProductsTable.FindElements(By.XPath(Constants.ProductPage.XP.ROW_QTY_UP));
            _productQtyDown = ProductsTable.FindElements(By.XPath(Constants.ProductPage.XP.ROW_QTY_DOWN));
            try
            {
                // apply variant information
                _logger.Trace(" > Building catalogue: variant info...");
                for (int i = 0; i < _productVariants.Count; ++i)
                {
                    string prodInfo = "start" + _productVariants[i].GetAttribute("title") + "end";
                    string varInfo = _productVariants[i].Text + "end";
                    Product newProd = new Product();
                    newProd.ProductNumber = HelperMethods.GetBetween(prodInfo, "Product #: ", " | ");
                    newProd.UPC = HelperMethods.GetBetween(prodInfo, "UPC: ", "end");
                    newProd.Colour = HelperMethods.GetBetween(varInfo, "Color: ", "\r\n");
                    newProd.Size = HelperMethods.GetBetween(varInfo, "Size: ", "\r\n");
                    newProd.Price = HelperMethods.GetBetween(varInfo, "$ ", "end");
                    newProd.QtyUp = _productQtyUp[i];
                    newProd.QtyDown = _productQtyDown[i];
                    newProd.Checked = false;
                    _products.Add(newProd);
                }
                _logger.Info(" > Building catalogue: variant info - Complete!");
            }
            catch (IndexOutOfRangeException) {
                _logger.Error("IndexOutOfRangeException encountered.");
            }

            _productQtyLocators = ProductsTable.FindElements(By.XPath(Constants.ProductPage.XP.PROD_VAR_QTYS));
            try
            {
                // apply quantity box locators
                _logger.Trace(" > Building catalogue: quantity locators...");
                for (int i = 0; i < _productQtyLocators.Count; ++i)
                {
                    _products[i].QtyLocator = _productQtyLocators[i];
                }
                _logger.Info(" > Building catalogue: quantity locators - Complete!");
            }
            catch (IndexOutOfRangeException) {
                _logger.Error("IndexOutOfRangeException encountered.");
            }

            _productRows = ProductsTable.FindElements(By.XPath("//div[contains(@class,'product-row-wrapper')]"));
            _productUpdateBtns = ProductsTable.FindElements(By.XPath("//button[contains(@class, 'btn-update-order')]"));
            int startVal = 0;
            try
            {
                // apply update buttons
                _logger.Trace(" > Building catalogue: update buttons...");
                for (int i = 0; i < _productRows.Count; ++i)
                {
                    int btnCount = _productRows[i].Text.Count(f => f == '$');
                    for (int x = startVal; x < startVal + btnCount; ++x)
                    {
                        _products[x].UpdateButton = _productUpdateBtns[i];
                    }
                    startVal += btnCount;
                }
                _logger.Info(" > Building catalogue: update buttons - Complete!");
            }
            catch (IndexOutOfRangeException) {
                _logger.Error("IndexOutOfRangeException encountered.");
            }
        }
 /// <summary>
 /// Find specific product in catalogue page to interat with
 /// </summary>
 /// <param name="prodNum">name of product to be searched for</param>
 /// <returns>Product object to interact with</returns>
 internal Product LoadProduct(string prodNum)
 {
     _logger.Trace(" > Searching for product: " + prodNum);
     Product currentProd = new Product();
     try
     {
         foreach (Product prod in _products)
         {
             if (prod.ProductNumber.Equals(prodNum))
             {
                 currentProd.ProductNumber = prod.ProductNumber;
                 currentProd.UPC = prod.UPC;
                 currentProd.Colour = prod.Colour;
                 currentProd.Size = prod.Size;
                 currentProd.Price = prod.Price;
                 currentProd.QtyUp = prod.QtyUp;
                 currentProd.QtyDown = prod.QtyDown;
                 currentProd.UpdateButton = prod.UpdateButton;
                 currentProd.QtyLocator = prod.QtyLocator;
                 _prodsInCart.Add(currentProd);
             }
         }
         _logger.Info(" > Product Found!");
     }
     catch (Exception)
     {
         _logger.Fatal(" > Searching for product " +prodNum+ " [FAILED]");
         _logger.Fatal("-- TEST FAILURE @ URL: '" + _driver.Url + "' --");
         BaseDriverTest.TakeScreenshot("screenshot");
     }
     return currentProd;
 }