/**
   * Converts a single user interaction to a Selenium command.
   *
   * @return the Selenium command name invoked.
   */
  private String handleUserInteraction(
      SeleniumHolder seleniumHolder, UserInteraction userInteraction) {

    IActionElement element = userInteraction.getElement();
    ActionType actionType = userInteraction.getActionType();
    boolean withinFrame = false;
    if (element instanceof PageElement
        && seleniumHolder.isPageElementWithinFrame((PageElement) element)) {
      // check if parent frame was found:
      if (TestPartStatus.FAIL == seleniumHolder.getParentFrame((PageElement) element).getStatus()) {
        ErrorHandler.logAndShowErrorDialogAndThrow(
            "Cannot interact with element "
                + element
                + ":\n"
                + "Parent frame "
                + seleniumHolder.getParentFrame((PageElement) element)
                + " not found.");
      }
      withinFrame = true;
      getToRightFrame(seleniumHolder, seleniumHolder.getParentFrame((PageElement) element));
    }
    // Getting selenium commands, locators and values:
    String commandName = SeleniumUtils.getCommandName(actionType);

    String locator = null;
    String inputValue = null;

    if (element instanceof Option) {
      Select selectbox = ((Option) element).getParent();
      locator = "xpath=" + seleniumHolder.getFullContextWithAllElements(selectbox);
      inputValue = SeleniumUtils.getOptionLocator((Option) element);
      if (SELECT.equals(actionType) && selectbox.getIdentifier(MULTISELECT).getProbability() > 0) {
        commandName = "addSelection"; // appropriate for multi-selection
      }
    } else {
      // all other elements
      if (element instanceof PageElement) {
        locator = "xpath=" + seleniumHolder.getFullContextWithAllElements((PageElement) element);
      } else if (element instanceof WebBrowser) {
        locator = userInteraction.getValue();
      } else {
        throw new ExporterException("Unsupported action element type");
      }
      inputValue = SeleniumUtils.getValue(userInteraction);
    }

    try {
      // invoke user interaction by reflection using command name from SeleniumUtil (legacy since
      // Selenese exporter was written first):

      if (SeleniumUtils.hasSeleniumInputColumn(userInteraction)) {
        // two parameters
        seleniumHolder.getSelenium().execute(commandName, locator, inputValue);
      } else {
        // one parameter only
        seleniumHolder.getSelenium().execute(commandName, locator);
      }
    } catch (Throwable e) {
      throw new UserInteractionException(e);
    }

    if (withinFrame && commandName.equals(SeleniumUtils.FIREEVENT)) {
      upToParentFrame(seleniumHolder);
    }
    return commandName;
  }