## 🚀 Feature Proposal

I suggest
1. either to add method `getId()` to interface `WebElement`, or
2. to create interface like `HasId` or `HasIdentity` and make `RemoteWebElement` implement it. 

## Motivation

People often cast `WebElement` to `RemoteWebElement` just to call method `getId()`. 
De-facto all implementations of `WebElement` have method `getId()`. 
For me, it's a problem because `RemoteWebElement` is a class, not interface, and therefore I cannot create a proxy object for it in Selenide. I need some interface with method `getId()`. 

if (arg instanceof RemoteWebElement) {
      return ImmutableMap.of(
        Dialect.OSS.getEncodedElementKey(), ((RemoteWebElement) arg).getId(),
        Dialect.W3C.getEncodedElementKey(), ((RemoteWebElement) arg).getId());
    }
    if (arg.getClass().isArray()) {
      arg = Arrays.asList((Object[]) arg);
    }
    if (arg instanceof Collection<?>) {
      Collection<?> args = (Collection<?>) arg;
      return args.stream().map(this).collect(toList());
    }
    if (arg instanceof Map<?, ?>) {
      Map<?, ?> args = (Map<?, ?>) arg;
      Map<String, Object> converted = new HashMap<>(args.size());
      for (Map.Entry<?, ?> entry : args.entrySet()) {
        Object key = entry.getKey();
        if (!(key instanceof String)) {
          throw new IllegalArgumentException(
              "All keys in Map script arguments must be strings: " + key.getClass().getName());
        }
        converted.put((String) key, apply(entry.getValue()));
      }
      return converted;
    }
    throw new IllegalArgumentException(
        "Argument is of an illegal type: " + arg.getClass().getName());
  }
}