diff --git a/BrowserHelper/Extensions/HtmlTableExtension.cs b/BrowserHelper/Extensions/HtmlTableExtension.cs index 8cad648..0f371c4 100644 --- a/BrowserHelper/Extensions/HtmlTableExtension.cs +++ b/BrowserHelper/Extensions/HtmlTableExtension.cs @@ -1,6 +1,8 @@ -using DataDomain; +using BrowserHelper.Settings; +using DataDomain; using OpenQA.Selenium; using System.Collections; +using System.Collections.Generic; namespace BrowserHelper.Extensions { @@ -73,7 +75,7 @@ namespace BrowserHelper.Extensions return tableDataCollection; } - public static List SimpleReadTablePartly(this IWebElement table, string[] shares, string[] shareHeaders) + public static List SimpleReadTablePartlyOld(this IWebElement table, string[] shares, string[] shareHeaders) { var shareCollection = new List(); var columns = table.FindElements(By.TagName("th")); @@ -114,6 +116,54 @@ namespace BrowserHelper.Extensions return shareCollection; } + + public static List SimpleReadTablePartly(this IWebElement table, string[] shares, string[] shareHeaders) + { + var shareSet = new HashSet(shares); + + var shareCollection = new List(); + var columns = table.FindElements(By.TagName("th")); + IWebElement tblBody = table.FindElement(By.XPath(".//tbody")); + var rows = tblBody.FindElements(By.TagName("tr")); + Dictionary columnPos = new Dictionary(); + //GlobalStopwatch.PrintSecs("After allocations"); + for (int i = 0; i < columns.Count; i++) + { + if (shareHeaders.Contains(columns[i].Text)) columnPos.Add(columns[i].Text, i); + } + //var antal = shares.Length; + int rowIndex = 0; + //GlobalStopwatch.PrintSecs("Before scraplooping"); + foreach (var row in rows) + { + var element = row.FindElement(By.XPath(".//td")); + if (!shareSet.Contains(element.Text)) { } + else + { + var colDatas = row.FindElements(By.TagName("td")); + if (colDatas.Count != 0 && shares.Contains(colDatas[0].Text)) + { + shareCollection.Add(new DiTraderStockRow + { + StockName = colDatas[columnPos["Aktie"]].Text, + LatestPrice = decimal.Parse(colDatas[columnPos["Senast"]].Text), + TimeOfDay = TimeSpan.Parse(colDatas[columnPos["Tid"]].Text) + }); + + rowIndex++; + //antal--; + shareSet.Remove(element.Text); + } + } + //if (antal < 1) break; + if (shareSet.Count < 1) break; + } + //GlobalStopwatch.PrintSecs("After scraplooping"); + return shareCollection; + } + + + private static ColumnSpecialValue GetControl(IWebElement columnValue) { ColumnSpecialValue? columnSpecialValue = null; diff --git a/StockDAL/StockMarketRepository.cs b/StockDAL/StockMarketRepository.cs index c5848e3..86cceea 100644 --- a/StockDAL/StockMarketRepository.cs +++ b/StockDAL/StockMarketRepository.cs @@ -249,7 +249,7 @@ namespace StockDal //GlobalStopwatch.PrintSecs("After dictionaries setup "); var groupedStocks = _stockRepository.GetStocksGroupedPerPerson(persId); //GlobalStopwatch.PrintSecs("After groupedStocks fetched "); - + var restStocks = new List(); var lastGroup = string.Empty; var stockList = new List(); foreach(var groupedStock in groupedStocks) @@ -261,8 +261,15 @@ namespace StockDal _testSettings.StockWishes = stockList.ToArray(); stockList.Clear(); //GlobalStopwatch.PrintSecs("Before GetStockStatus"); - saveStockData( _scrapePage.GetMyStockStatus(lastGroup)); + if (lastGroup == "ZNotFound") + saveStockData(new List( _scrapePage.SearchStockAndCollect("Pfizer"))); + else + saveStockData( _scrapePage.GetMyStockStatus(lastGroup)); //GlobalStopwatch.PrintSecs("After GetStockStatus"); + if (_testSettings.StockWishes.Length > 0) + { + restStocks.AddRange(_testSettings.StockWishes); + } lastGroup = groupedStock.StockGroup; } else @@ -282,7 +289,14 @@ namespace StockDal { _testSettings.StockWishes = stockList.ToArray(); stockList.Clear(); - saveStockData(_scrapePage.GetMyStockStatus(lastGroup)); + if (lastGroup == "ZNotFound") + saveStockData(new List(_scrapePage.SearchStockAndCollect("Pfizer"))); + else + saveStockData(_scrapePage.GetMyStockStatus(lastGroup)); + if (_testSettings.StockWishes.Length > 0) + { + restStocks.AddRange(_testSettings.StockWishes); + } } if (DumpObjects.Any()) diff --git a/StockDAL/StockScrapePage.cs b/StockDAL/StockScrapePage.cs index 1b18fb2..8e32ac7 100644 --- a/StockDAL/StockScrapePage.cs +++ b/StockDAL/StockScrapePage.cs @@ -32,8 +32,46 @@ namespace StockDAL Thread.Sleep(500); chooseList.SelectDropDownByText(listText); Thread.Sleep(800); - var stockList = tblList.SimpleReadTablePartly(_testSettings.StockWishes, _testSettings.StocWishCols); - return stockList; + var stockListTuple = tblList.SimpleReadTablePartly(_testSettings.StockWishes, _testSettings.StocWishCols); + return stockListTuple; + } + + public List SearchStockAndCollect(string stockName) + { + var returnValue = new List(); + IWebElement searchStock = _driver.FindElement(By.XPath("//*[@id='searchbox']/div/div[1]/input")); + searchStock.ClearAndEnterText(stockName); + //Console.WriteLine("SearchField filled out"); + Thread.Sleep(1000); + var clicker = searchStock.FindElements(By.XPath("//*[@id='searchbox']/div/div[2]/table/tbody/tr/td/a")); + // Thread.Sleep(1000); + //Console.WriteLine("Click-field searched"); + if (clicker.FirstOrDefault() != null) + { + if (clicker.FirstOrDefault().Displayed) + { + var output = new DiTraderStockRow(); + output.StockName = clicker.FirstOrDefault().Text; + + // Console.WriteLine("Click-field found"); + //Thread.Sleep(1000); + clicker.FirstOrDefault().Click(); + Thread.Sleep(800); + var valueField = _driver.FindElement(By.XPath("//*[@id='quote-details']/table/tbody/tr/td[5]")); + //Console.WriteLine("value-field searched"); + if (valueField.Displayed) + { + //Console.WriteLine("value-field found"); + output.LatestPrice = decimal.Parse( valueField.Text); + output.TimeOfDay = TimeSpan.Parse(DateTime.Now.ToString().Substring(11)); + _driver.FindElement(By.XPath("//*[@id='equity-detail-page']/div[1]/div[1]/a")).Click(); + returnValue.Add(output); + return returnValue; + } + } + } + //Console.WriteLine("Click-field not found"); + return null; } public void GetStocksPerList(string listText) diff --git a/StockDal.Interface/IStockScrapePage.cs b/StockDal.Interface/IStockScrapePage.cs index 2149b5a..4e3276f 100644 --- a/StockDal.Interface/IStockScrapePage.cs +++ b/StockDal.Interface/IStockScrapePage.cs @@ -5,6 +5,7 @@ namespace StockDAL.Interface public interface IStockScrapePage { List GetMyStockStatus(string listText); + List SearchStockAndCollect(string stockName); void GetStocksPerList(string listText); void PerformClickOnSpecialValue(string name, string operation); }