using Newtonsoft.Json; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using StockDal.Interface; using DataDomain; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Diagnostics; namespace StockDal { public class StockMarketRepository : IStockMarketRepository { public Dictionary StockMarketList { get; set; } public List DumpObjects { get; set; } = new List(); public DiTraderStockRow SaveRow { get; set; } public StringBuilder TextResults { get; set; } public bool ViewBrowser { get; set; } public IWebDriver driver; public StockMarketRepository() { ViewBrowser = false; } private void Find_Data() { TextResults = new StringBuilder(); IList searchElements = driver.FindElements(By.TagName("tbody")); foreach (IWebElement i in searchElements) { HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument(); var text = i.GetAttribute("innerHTML"); htmlDocument.LoadHtml(text); var inputs = htmlDocument.DocumentNode.Descendants("tr").ToList(); foreach (var items in inputs) { HtmlAgilityPack.HtmlDocument htmlDocument1 = new HtmlAgilityPack.HtmlDocument(); htmlDocument1.LoadHtml(items.InnerHtml); var tds = htmlDocument1.DocumentNode.Descendants("td").ToList(); var appendText = ""; var fNr = 0; foreach (var item in tds) { var intext = item.InnerText.Replace("\r\n", ""); appendText += appendText.Length == 0 ? intext : " " + intext; if (tds.Count == 10) { AddValueToListRow(fNr++, intext); } } if (!string.IsNullOrEmpty(appendText)) { TextResults.Append(appendText + "\r\n"); } htmlDocument1 = null; } htmlDocument = null; TextResults.Append("\r\n"); } // var oxe = StockMarketList; } private void SaveLogging() { var output = JsonConvert.SerializeObject(DumpObjects, Formatting.Indented); Assembly assem = typeof(StockMarketRepository).Assembly; var programPath = assem.Location.Substring(0, assem.Location.LastIndexOf("\\")); var logPath = new DirectoryInfo(programPath + "\\Loggings"); if (!logPath.Exists) { logPath.Create(); } File.WriteAllText($"{programPath}\\Loggings\\Log{DateTime.Now.ToShortDateString()}.txt", output); } private void AddValueToListRow(int pos, string value) { switch (pos) { case 0: { SaveRow = new DiTraderStockRow(); SaveRow.StockName = value; break; } case 1: { SaveRow.ProcChange = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 2: { SaveRow.RealChange = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 3: { SaveRow.BuyPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 4: { SaveRow.SellPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 5: { SaveRow.LatestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 6: { SaveRow.HighestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 7: { SaveRow.LowestPrice = string.IsNullOrWhiteSpace(value) ? 0 : decimal.Parse(value); break; } case 8: { SaveRow.Volume = string.IsNullOrWhiteSpace(value) ? 0 : long.Parse(value.Replace(" ", "")); break; } case 9: { SaveRow.TimeOfDay = value==""?TimeSpan.Parse("00:01"): TimeSpan.Parse(value); //StockMarketList.Add(SaveRow.StockName, SaveRow); try { StockMarketList.Add(SaveRow.StockName, SaveRow); } catch (ArgumentException ) { try { StockMarketList.Add(SaveRow.StockName + "-2", SaveRow); } catch (Exception) { DumpObjects.Add(SaveRow); } } break; } default: break; } } private void OpenBrowser(bool burl2 = false) { var driverService = ChromeDriverService.CreateDefaultService(); driverService.HideCommandPromptWindow = true; if (ViewBrowser) { if (driver == null) { driver = new ChromeDriver(driverService); } } else { if (driver == null) { var options = new ChromeOptions(); options.AddArgument("headless"); driver = new ChromeDriver(driverService, options); } } try { //var url0 = "https://money.cnn.com/data/hotstocks/index.html"; var url = "https://trader.di.se/index.php/stocklist/index/2055?list=7126"; var url2 = "https://trader.di.se/index.php/stocklist/index/2055?list=7116"; //var url1 = "https://www.finansportalen.se/aktiekurser/"; driver.Navigate().GoToUrl(burl2 ? url2 : url); } catch { throw; } } public void LoadStockMarketList() { StockMarketList = new Dictionary(); DumpObjects = new List(); OpenBrowser(); Find_Data(); OpenBrowser(true); Find_Data(); if (DumpObjects.Any()) { SaveLogging(); } } public void LoadStockMarketList(bool viewBrowser) { StockMarketList = new Dictionary(); ViewBrowser = viewBrowser; OpenBrowser(); Find_Data(); } public void RefreshMarketList() { StockMarketList = new Dictionary(); driver.Navigate().Refresh(); Find_Data(); } public void Clean() { driver?.Quit(); } } }