public void Init(string Email, string Password, List <InternalItem> internalItems, string url, bool isEnableTicket) { if (internalItems == null && internalItems.Count == 0) { return; } bool isActivityUse = internalItems.Exists(x => x.Activity != null); using (var driver = new ChromeDriver(Path.GetDirectoryName(this.ChromeDriverFolder), this.ChromeOptions)) { SeleniumHelper selenium = new SeleniumHelper(driver); driver.Navigate().GoToUrl(url); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(200); selenium.FindElement(By.XPath("//*[@data-original-title='Log in using your Google account']"), 50) .Click(); selenium.GoogleLogin(Email, Password); Thread.Sleep(4000); IWebElement Element = selenium.FindElement(By.XPath("//table[@class='table table-hover']"), 100); IWebElement Table = Element.FindElement(By.TagName("tbody")); IJavaScriptExecutor js = driver as IJavaScriptExecutor; List <WebProject> listProject = new List <WebProject>(); foreach (var tr in Table.FindElements(By.TagName("tr"))) { js.ExecuteScript("arguments[0].style='background-color: red;'", tr); WebProject newProject = new WebProject(); int elementCount = 0; foreach (var td in tr.FindElements(By.TagName("td"))) { if (elementCount == 1) { newProject.Project = td.Text; } if (elementCount == 2) { newProject.Task = td.Text; } if (elementCount == 7) { newProject.Button = td.FindElements(By.TagName("button"))[1]; newProject.IdElement = td.FindElements(By.TagName("button"))[1].GetAttribute("data-id"); } elementCount++; } listProject.Add(newProject); js.ExecuteScript("arguments[0].style='background-color: gray;'", tr); } listProject = listProject.OrderBy(lp => lp.Project).ToList(); List <InternalItem> histories = new List <InternalItem>(); using (StreamReader sr = new StreamReader("TimeEntries.txt", false)) { string line; while ((line = sr.ReadLine()) != null) { string[] words = line.Split(';'); histories.Add(new InternalItem() { Project = words[1], Task = words[2], Activity = words[3], Comment = words[0] }); } } InternalItem history = new InternalItem(); foreach (InternalItem entry in internalItems) { if (entry.Project == null && histories.Exists(h => h.Comment.Equals(entry.Comment))) { if (isActivityUse) { history = histories.FindLast(h => h.Comment.Equals(entry.Comment) && h.Activity == entry.Activity); } else { history = histories.FindLast(h => h.Comment.Equals(entry.Comment)); } if (history != null && listProject.Any(x => x.Project.Equals(history.Project))) { entry.Project = history.Project; entry.Task = history.Task; entry.Activity = history.Activity; } } if (entry.Project == null) { InternalItem aux = InternalHelper.GetPredictedProjectValue(entry); entry.Project = aux.Project; entry.Task = aux.Task; } if (entry.Project == null) { var webProjectObject = GetProjectValue(listProject, entry); //If select skip option if (string.IsNullOrEmpty(webProjectObject.Project)) { continue; } entry.Project = webProjectObject.Project; entry.Task = webProjectObject.Task; Console.Clear(); } if (entry.Activity == null || string.IsNullOrEmpty(entry.Activity)) { entry.Activity = InternalHelper.GetPredictedActivityValue(entry.Comment); } if (entry.Activity == null || string.IsNullOrEmpty(entry.Activity)) { entry.Activity = InternalHelper.GetActivityValue(entry); Console.Clear(); } if (!(histories.Exists(h => h.Comment.Equals(entry.Comment)) && histories.Exists(h => h.Activity.Equals(entry.Activity)) && histories.Exists(h => h.Project.Equals(entry.Project)) && histories.Exists(h => h.Task.Equals(entry.Task)))) { using (StreamWriter outputFile = File.AppendText("TimeEntries.txt")) { outputFile.WriteLine($"{entry.Comment};{entry.Project};{entry.Task};{entry.Activity}"); } histories.Add(new InternalItem() { Project = entry.Project, Task = entry.Task, Activity = entry.Activity, Comment = entry.Comment }); } } //Remove all skip entries internalItems.RemoveAll(x => x.IsSkip); internalItems = GroupByPerDay(internalItems); foreach (InternalItem entry in internalItems) { WebProject test = listProject.Find(l => l.Project.ToLower().Equals(entry.Project.ToLower()) && l.Task.ToLower().Equals(entry.Task.ToLower())); if (test != null) { DateTime myDate = DateTime.ParseExact(entry.Date, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); //string timeDaily = (double.Parse(Time.GetInternalTime(entry.Time).Replace(".", ",")) / 2).ToString().Replace(",", "."); string timeDaily = TimeHelper.GetInternalTime(entry.Time); selenium.FindElement(By.XPath("//button[@data-id='" + test.IdElement + "']"), 50).Click(); Thread.Sleep(5000); selenium.FindElement(By.XPath("//input[@name='WorkedHourDate']"), 50).Clear(); selenium.FindElement(By.XPath("//input[@name='WorkedHourDate']"), 50) .SendKeys(myDate.ToString("dd/MM/yyyy")); selenium.FindElement(By.XPath("//input[@name='WorkedHourDate']"), 50).SendKeys(Keys.Enter); selenium.FindElement(By.XPath("//input[@name='Amount']"), 50).Clear(); selenium.FindElement(By.XPath("//input[@name='Amount']"), 50).SendKeys(entry.Time); selenium.FindElement(By.XPath("//input[@name='Description']"), 50).SendKeys(entry.Comment); if (!string.IsNullOrWhiteSpace(entry.Ticket) && isEnableTicket) { selenium.FindElement( By.XPath("//span[@class='select2-selection select2-selection--single']"), 50).Click(); IWebElement TicketSelect = selenium.FindElement(By.XPath("//input[@class='select2-search__field']"), 50); TicketSelect.SendKeys(entry.Ticket); Thread.Sleep(15000); try { TicketSelect.SendKeys(Keys.Enter); } catch (Exception e) { Thread.Sleep(15000); TicketSelect.SendKeys(Keys.Enter); } } IWebElement ActivitySelect = selenium.FindElement(By.XPath("//*[@id='addDashboardHoursInputActivities']"), 50); ActivitySelect.Click(); ActivitySelect.FindElement(By.XPath(".//option[contains(text(),'" + entry.Activity + "')]")) .Click(); selenium.FindElement(By.XPath("//button[@value='submit']"), 50).Click(); } else { Console.WriteLine(string.Format( "Project {0} doesn't exist - Task {1} - Activity {2} - Date {3}", entry.Project.ToLower(), entry.Task, entry.Activity, entry.Date)); } } } }