如果XPath找不到元素,则Selenium MoveToElement不起作用

时间:2016-04-06 11:51:43

标签: c# selenium selenium-webdriver

Selenium Webdriver for C#中的MoveToElement函数存在问题。 MoveToElement似乎没有做任何事情。

我有以下HTML:

<div id="rounded-navigation-with-icons">
    <ul>
        <li class="navigation-item">
            <a href="Members" target="_self" class="navigation-item-title"></a>
            <ul>                    
                <li>
                    <a href="MembersTestPage" target="_self"></a>
                </li>
            </ul>
        </li>
    </ul>
</div>

最初隐藏最内层列表,直到导航项被鼠标悬停。

然后我有以下代码来单击Selenium可见的navigation-item-title,然后单击MembersTestPage链接。

    public bool SearchForElement(string elementToFind, Page.FindBy by)
    {
        var navigation = Page.FindElement("rounded-navigation-with-icons", Page.FindBy.ID);
        if (navigation != null)
        {
            foreach (var item in navigation.FindElements(By.ClassName("navigation-item")))
            {
                var titleElements = Page.FindElements("navigation-item-title", Page.FindBy.ClassName);
                Actions action = new Actions(Driver.Instance);
                foreach (var moveToItem in titleElements)
                {
                    try
                    {
                        // Move to the main navigation link container element, but it doesn't work
                        action.MoveToElement(moveToItem);

                        // Move the mouse position manually to the link's location
                        action.MoveByOffset(moveToItem.Location.X, moveToItem.Location.Y);

                        // This does correctly find the element
                        var element = Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector);
                        action.MoveToElement(element);

                        // Click returns that the element is hidden/invisible and therefore cannot be clicked
                        element.Click();
                        return true;
                    }
                    catch (Exception)
                    {
                    }
                }
            }
        }
        return false;
    }

你可以看到我通过传递元素来使用MoveToElement,也可以手动传递项目的X和Y值,但两者都没有工作。

如果我通过XPath找到元素,这可以按预期工作。

我做错了什么?感谢

2 个答案:

答案 0 :(得分:3)

在Selenium中使用Actions时,您必须最终调用Perform()方法,否则操作仅在内部收集,但从未在浏览器中执行。

您可以致电

action.Perform();

action.Build().Perform();

没关系。如果省略Build(),则Perform()会隐式调用它。

答案 1 :(得分:0)

我最近遇到了类似的问题,我的解决方案是将所有内容都作为一个动作执行:

action.MoveToElement(moveToItem)
      .MoveByOffset(moveToItem.Location.X, moveToItem.Location.Y)
      .MoveToElement(Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector))
      .click(Page.FindElement("a[href='MembersTestPage']", Page.FindBy.CssSelector))
      .build()
      .perform();