public BrowserCommandResult SelectLookup()

in Microsoft.Dynamics365.UIAutomation.Api/XrmPage.cs [399:499]


        public BrowserCommandResult<bool> SelectLookup(LookupItem control)
        {
            return this.Execute(GetOptions($"Set Lookup Value: {control.Name}"), driver =>
            {
                if (driver.HasElement(By.XPath(Elements.Xpath[Reference.Entity.LookupFieldContainer].Replace("[NAME]", control.Name.ToLower()))))
                {
                    var fieldElement = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.LookupFieldContainer].Replace("[NAME]", control.Name.ToLower())));
                    var dialogName = $"Dialog_{control.Name}_IMenu";
                    IWebElement dialog;
                    List<ListItem> dialogItems;
                    ListItem dialogItem;

                    // If field contains a value, clear the value and then set the new desired value
                    if (fieldElement.Text != "")
                    {
                        fieldElement.Hover(driver, true);

                        if (fieldElement.FindElement(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name.ToLower()))) == null)
                            throw new InvalidOperationException($"Field: {control.Name} is not Lookup control");

                        driver.Manage().Window.Maximize();
                        var lookupSearch = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name.ToLower())));

                        if (!lookupSearch.Displayed)
                        {
                            driver.Manage().Window.Minimize();
                            driver.Manage().Window.Maximize();
                            fieldElement.Hover(driver, true);
                            lookupSearch = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name.ToLower())));
                        }

                        lookupSearch.Click(true);

                        dialog = driver.WaitUntilAvailable(By.Id(dialogName));
                        dialogItems = OpenDialog(dialog).Value;

                        if (dialogItems.Any())
                        {
                            dialogItem = dialogItems.Last();
                            dialogItem.Element.Click();
                        }

                        SwitchToDialog();

                        Browser.ThinkTime(500);

                        driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.LookUp.Remove])).Click(true);

                        SwitchToContent();

                    }

                    fieldElement = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.LookupFieldContainer].Replace("[NAME]", control.Name.ToLower())));
                    fieldElement.Hover(driver);
                    fieldElement.Click(true);

                    var lookupSearchIcon = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name)));

                    if (Browser.Options.BrowserType != BrowserType.Firefox)
                    {
                        var lookupIcon = fieldElement.FindElement(By.ClassName("Lookup_RenderButton_td"));
                        lookupSearchIcon = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name)));
                        lookupIcon.Hover(driver);
                        lookupIcon.Click(true);

                        /*
                        lookupSearchIcon.Hover(driver, true);
                        lookupSearchIcon.Click(true);

                        var lookupSearchIconImage = driver.FindElement(By.TagName("img"));
                        lookupSearchIconImage.Hover(driver, true);

                        Actions clickAction = new Actions(driver).SendKeys(Keys.Enter);
                        clickAction.Build().Perform();
                        */
                    }
                    else
                    {
                        var lookupIcon = fieldElement.FindElement(By.ClassName("Lookup_RenderButton_td"));
                        lookupSearchIcon = driver.WaitUntilAvailable(By.XPath(Elements.Xpath[Reference.Entity.GetLookupSearchIcon].Replace("[NAME]", control.Name)));
                        lookupIcon.Hover(driver);
                        lookupIcon.Click(true);
                    }


                    dialog = driver.WaitUntilAvailable(By.Id(dialogName));
                    dialogItems = OpenDialog(dialog).Value;

                    if (dialogItems.Count < control.Index)
                        throw new InvalidOperationException($"List does not have {control.Index + 1} items.");

                    dialogItem = dialogItems[control.Index];
                    dialogItem.Element.Click();

                }
                else
                    throw new InvalidOperationException($"Field: {control.Name} Does not exist");

                return true;
            });
        }