in Microsoft.Dynamics365.UIAutomation.Api.UCI/WebClient.cs [2619:2725]
public BrowserCommandResult<bool> SetValue(BooleanItem option, FormContextType formContextType)
{
return this.Execute(GetOptions($"Set BooleanItem Value: {option.Name}"), driver =>
{
// ensure that the option.Name value is lowercase -- will cause XPath lookup issues
option.Name = option.Name.ToLowerInvariant();
IWebElement fieldContainer = null;
fieldContainer = ValidateFormContext(driver, formContextType, option.Name, fieldContainer);
var hasRadio = fieldContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldRadioContainer].Replace("[NAME]", option.Name)));
var hasCheckbox = fieldContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldCheckbox].Replace("[NAME]", option.Name)));
var hasList = fieldContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldList].Replace("[NAME]", option.Name)));
var hasToggle = fieldContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldToggle].Replace("[NAME]", option.Name)));
var hasFlipSwitch = fieldContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldFlipSwitchLink].Replace("[NAME]", option.Name)));
// Need to validate whether control is FlipSwitch or Button
IWebElement flipSwitchContainer = null;
var flipSwitch = hasFlipSwitch ? fieldContainer.TryFindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldFlipSwitchContainer].Replace("[NAME]", option.Name)), out flipSwitchContainer) : false;
var hasButton = flipSwitchContainer != null ? flipSwitchContainer.HasElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldButtonTrue])) : false;
hasFlipSwitch = hasButton ? false : hasFlipSwitch; //flipSwitch and button have the same container reference, so if it has a button it is not a flipSwitch
hasFlipSwitch = hasToggle ? false : hasFlipSwitch; //flipSwitch and Toggle have the same container reference, so if it has a Toggle it is not a flipSwitch
if (hasRadio)
{
var trueRadio = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldRadioTrue].Replace("[NAME]", option.Name)));
var falseRadio = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldRadioFalse].Replace("[NAME]", option.Name)));
if (option.Value && bool.Parse(falseRadio.GetAttribute("aria-checked")) || !option.Value && bool.Parse(trueRadio.GetAttribute("aria-checked")))
{
driver.ClickWhenAvailable(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldRadioContainer].Replace("[NAME]", option.Name)));
}
}
else if (hasCheckbox)
{
var checkbox = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldCheckbox].Replace("[NAME]", option.Name)));
if (option.Value && !checkbox.Selected || !option.Value && checkbox.Selected)
{
driver.ClickWhenAvailable(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldCheckboxContainer].Replace("[NAME]", option.Name)));
}
}
else if (hasList)
{
var list = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldList].Replace("[NAME]", option.Name)));
var options = list.FindElements(By.TagName("option"));
var selectedOption = options.FirstOrDefault(a => a.HasAttribute("data-selected") && bool.Parse(a.GetAttribute("data-selected")));
var unselectedOption = options.FirstOrDefault(a => !a.HasAttribute("data-selected"));
var trueOptionSelected = false;
if (selectedOption != null)
{
trueOptionSelected = selectedOption.GetAttribute("value") == "1";
}
if (option.Value && !trueOptionSelected || !option.Value && trueOptionSelected)
{
if (unselectedOption != null)
{
driver.ClickWhenAvailable(By.Id(unselectedOption.GetAttribute("id")));
}
}
}
else if (hasToggle)
{
var toggle = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldToggle].Replace("[NAME]", option.Name)));
var link = toggle.FindElement(By.TagName("button"));
var value = bool.Parse(link.GetAttribute("aria-checked"));
if (value != option.Value)
{
link.Click();
}
}
else if (hasFlipSwitch)
{
// flipSwitchContainer should exist based on earlier TryFindElement logic
var link = flipSwitchContainer.FindElement(By.TagName("a"));
var value = bool.Parse(link.GetAttribute("aria-checked"));
if (value != option.Value)
{
link.Click();
}
}
else if (hasButton)
{
var container = fieldContainer.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldButtonContainer].Replace("[NAME]", option.Name)));
var trueButton = container.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldButtonTrue]));
var falseButton = container.FindElement(By.XPath(AppElements.Xpath[AppReference.Entity.EntityBooleanFieldButtonFalse]));
if (option.Value)
{
trueButton.Click();
}
else
{
falseButton.Click();
}
}
else
throw new InvalidOperationException($"Field: {option.Name} Does not exist");
return true;
});
}