Search code examples
c#seleniumselenium-webdrivertransparentproxy

Selenium - MoveToElement() with transparent proxy


I have element

public ArticlePage()
{
    PageFactory.InitElements(Browser.driver, this)
}

[FindsBy(How = How.Id, Using = "someId")]
private IWebElement btnTitleView { get; set; }

and action

Actions action = new Actions(Browser.driver);
action.MoveToElement(btnTitleView).Perform();

But when i try to run it, i will get error

'System.Reflection.TargetException' Object does not match target type.

I tried to locate this element by Browser.driver.FindElement(By.Id("someId")) and then it is working correctly. So, it is present and displayed.
Is it possible to use transparent proxy to perform Actions? Is there any other way to perform MoveToElement() like action on transparent proxy?


Solution

  • In order to unwrap element which using transparent proxy you can use IWrapsElement interface which has WrappedElement property:

    action.MoveToElement(((IWrapsElement)btnTitleView).WrappedElement).Build().Perform();
    

    You may also want to have that cast included as extension method of IWebElement object:

    public static class IWebElementExtensions
    {
        public static IWebElement Unwrap(this IWebElement element)
        {
            return ((IWrapsElement)element).WrappedElement;
        }
    }
    

    Then the code of your action might look like this:

    Actions action = new Actions(Browser.driver);
    action.MoveToElement(btnTitleView.Unwrap()).Build().Perform();
    

    I hope that answer will help you with your problem :)