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;
});
}