public By ElementFinder(ElementObject ele) { return(ele.EleType switch { ElementType.Id => By.Id(ele.EleRef), ElementType.Class => By.ClassName(ele.EleRef), ElementType.Name => By.Name(ele.EleRef), ElementType.Xpath => By.XPath(ele.EleRef), ElementType.CSS => By.CssSelector(ele.EleRef), ElementType.LinkText => By.LinkText(ele.EleRef), ElementType.Tag => By.TagName(ele.EleRef), ElementType.PartialLinkText => By.PartialLinkText(ele.EleRef), _ => null, });
//general method to handle actions //general method to handle action on existing elements //helper method to complete the work/actions //ensure good assertions //https://stackoverflow.com/questions/2082615/pass-method-as-parameter-using-c-sharp public ElementResult ExecuteAction(ElementObject ele, ElementResult starter = null) { if (TE.TestTimeLimit < DateTime.Now) { TE.Assert.Fail($"Test Exceeded Max Time Limit of: {TE.TestTimeLimit.Subtract(TE.StartTime)} (hh:mm:ss)"); } var eleName = starter == null ? ele.ElementName : starter.ElementName; if (ele.ReportStep) { switch (ele.Action) { case ElementAction.Click: case ElementAction.EnterText: case ElementAction.Dropdown: case ElementAction.DropdownIndex: case ElementAction.RadioBtn: case ElementAction.MultiDropdown: case ElementAction.Hover: TE.BeginTestCaseStep($"Execute action {ele.Action} on element: {eleName}", ele.Random || ele.ProtectedValue ? "Random Value" : ele.Text); break; } } var element = starter; //check if 'ele' has an element in it or not. if (!string.IsNullOrEmpty(ele.EleRef)) { if (ele.EleType == ElementType.AccessabilityId) { element = FindAppiumElement(ele, starter?.RawEle); } else { var finder = ElementFinder(ele); element = FindElement(ele, finder, starter?.RawEle); } } return(CompleteAction(ele, element)); }
public List <ElementResult> ExecuteActions(ElementObject ele, ElementResult starter = null) { if (TE.TestTimeLimit < DateTime.Now) { TE.Assert.Fail($"Test Exceeded Max Time Limit of: {TE.TestTimeLimit.Subtract(TE.StartTime).TotalSeconds} seconds"); } var eleName = starter == null ? ele.ElementName : starter.ElementName; if (ele.ReportStep) { switch (ele.Action) { case ElementAction.Click: case ElementAction.EnterText: case ElementAction.Dropdown: case ElementAction.DropdownIndex: case ElementAction.RadioBtn: case ElementAction.MultiDropdown: case ElementAction.Hover: TE.BeginTestCaseStep($"Execute action {ele.Action} on elements: {eleName}", ele.Random || ele.ProtectedValue ? "Random Value" : ele.Text); break; } } List <ElementResult> elements = null; if (ele.EleType == ElementType.AccessabilityId) { elements = FindAppiumElements(ele, starter?.RawEle); } else { var finder = ElementFinder(ele); elements = FindElements(ele, finder, starter?.RawEle); } var rtn = new List <ElementResult>(); elements.ForEach(x => rtn.Add(CompleteAction(ele, x))); return(rtn); }
private ElementResult CompleteAction(ElementObject eleObj, ElementResult eleRes) { SelectElement select; var ele = eleRes.RawEle; var rsp = new ElementResult(TE) { Success = false, RawEle = ele, ElementName = eleObj.ElementName }; if (ele == null && !(eleObj.Action == ElementAction.Wait && eleObj.WaitType == Wait.Invisible)) { return(rsp); } if (eleObj.Random) { eleObj.Text = TE.Rand.GetRandomString(eleObj.RandomLength); } try { if (eleObj.Scroll) { try { rsp.ScrollTo(eleObj.ScrollLoc); } catch { try { //scroll till element is within the center 50% of the screen??????????? Just not sure how to drag.. //TouchActions action = new TouchActions(Driver); //var visibleText = "Submit"; //((AndroidDriver<IWebElement>)Driver).FindElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().textContains(\"" + visibleText + "\").instance(0))"); //TouchActions action = new TouchActions(Driver); //action.Scroll(ele, 10, 100).Perform(); } catch (Exception e) { Console.WriteLine(e.Message); } } // (((IWrapsDriver)ele).WrappedDriver as IJavaScriptExecutor).ScrollToElement(ele); } switch (eleObj.Action) { case ElementAction.Click: ele.Click(); break; case ElementAction.Hover: var act = new Actions(Driver); act.MoveToElement(ele).Build().Perform(); TE.Pause(150); //default pause for hover to take effect break; case ElementAction.EnterText: if (eleObj.Clear) { ele.Clear(); ele.SendKeys(Keys.Control + "a"); ele.SendKeys(Keys.Backspace); } ele.SendKeys(eleObj.Text); break; case ElementAction.Dropdown: if (eleObj.Random) { eleObj.Action = ElementAction.DropdownIndex; return(CompleteAction(eleObj, eleRes)); } select = new SelectElement(ele); if (select.IsMultiple && eleObj.Clear) { select.DeselectAll(); } rsp.Text = SetDropdown(select, eleObj.Text); break; case ElementAction.GetDropdown: select = new SelectElement(ele); if (select.IsMultiple) { var tempLst = new List <string>(); select.AllSelectedOptions.ToList().ForEach(x => tempLst.Add(x.Text)); rsp.Text = string.Join('|', tempLst); } else { rsp.Text = select.SelectedOption.Text; } break; case ElementAction.DropdownIndex: select = new SelectElement(ele); if (select.IsMultiple && eleObj.Clear) { select.DeselectAll(); } var start = eleObj.Text.Length > 1 ? 1 : 0; var index = TE.Rand.Rnd.Next(start, select.Options.Count); if (int.TryParse(eleObj.Text, out int indexVal) || !eleObj.Random) { index = indexVal; } select.SelectByIndex(index); rsp.Text = select.Options[index].Text; break; case ElementAction.MultiDropdown: select = new SelectElement(ele); if (select.IsMultiple && eleObj.Clear) { select.DeselectAll(); } foreach (var option in eleObj.Text.Split('|')) { SetDropdown(select, option); } break; case ElementAction.RadioBtn: if (!eleObj.Text.ToLower().Equals(ele.Selected.ToString().ToLower())) { ele.Click(); } break; case ElementAction.GetCheckbox: rsp.Text = ele.Selected.ToString(); break; case ElementAction.GetText: if (ele.TagName.Equals("select")) { select = new SelectElement(ele); if (select.IsMultiple) { var ops = new List <string>(); select.AllSelectedOptions.ToList().ForEach(x => ops.Add(x.Text)); rsp.Text = string.Join("\n", ops); } else { rsp.Text = select.SelectedOption.Text; } } else { rsp.Text = ele.Text; } if (string.IsNullOrEmpty(rsp.Text)) { rsp.Text = ele.GetAttribute("value"); } if (rsp.Text == null) { rsp.Text = ""; } break; case ElementAction.GetAttribute: rsp.Text = ele.GetAttribute(eleObj.Text); break; case ElementAction.GetCSS: rsp.Text = ele.GetCssValue(eleObj.Text); break; case ElementAction.GetProperty: rsp.Text = ele.GetProperty(eleObj.Text); break; case ElementAction.Wait: //nothing to do here break; default: throw new NotImplementedException("This action has not been implemented. Please implement it."); } } catch (Exception e) { rsp.Exception = e; rsp.Success = false; return(rsp); } rsp.Success = true; return(rsp); }