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找到元素,这可以按预期工作。
我做错了什么?感谢
答案 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();