3

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?

nEkis
  • 320
  • 1
  • 14

2 Answers2

2

One way how to get around this is to use IList<IWebElement> and than use foreach or LINQ to manipulate the element. So you can use:

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

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

or

foreach (var element in btnTitleView)
{
   Actions action = new Actions(Browser.driver);
   action.MoveToElement(element).Perform();
}
nEkis
  • 320
  • 1
  • 14
2

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 :)

Gucu112
  • 877
  • 10
  • 12