与IE的Selenium Hover元素

时间:2013-10-29 15:10:39

标签: java .net selenium selenium-webdriver internet-explorer-8

我有一个HTML div标签,在div内部有一个元素,当鼠标进入其边界时出现。现在我想点击鼠标进入或悬停时可见的元素。

问题:元素开始闪烁。 浏览器:IE8

我正在使用以下代码

   IWebElement we = addToBasket.FindElement(By.Id("MyBox"));
   action.MoveToElement(we).MoveToElement(driver.FindElement(By.Id("plus-icon"))).Click().Build().Perform();

有什么建议为什么会眨眼?

2 个答案:

答案 0 :(得分:18)

元素闪烁是因为IE驱动程序的一个功能称为"持久性悬停。"此功能具有可疑价值,但由于使用SendMessage API时IE(浏览器,而不是驱动程序)responds to WM_MOUSEMOVE messages处于脑死亡状态,因此需要使用此功能。

您有几个选择。您可以使用以下代码关闭持久性悬停:

InternetExplorerOptions options = new InternetExplorerOptions();
options.EnablePersistentHover = false;
IWebDriver driver = new InternetExplorerDriver(options);

请注意,虽然这会使您在尝试悬停时遇到物理鼠标光标在屏幕上的奇思妙想。如果这不可接受,您可以选择couple of other approaches。首先,你可以关闭所谓的"原生事件,"这将导致驱动程序仅依赖于合成的JavaScript事件。这种方法有其自身的缺陷,因为仅依靠JavaScript来合成鼠标事件。

InternetExplorerOptions options = new InternetExplorerOptions();
options.EnableNativeEvents = false;
IWebDriver driver = new InternetExplorerDriver(options);

最后,您可以使用默认的SendMessage Windows API迁移到使用更正确的SendInput API的代码。这是通过RequireWindowFocus属性完成的。它的缺点是鼠标输入在系统中以非常低的水平注入,这要求IE窗口成为系统的前台窗口。

InternetExplorerOptions options = new InternetExplorerOptions();
options.RequireWindowFocus = true;
IWebDriver driver = new InternetExplorerDriver(options);

最后请注意,不要试图一次性设置所有这些属性;选择一种方法并坚持下去。其中有几个是互斥的,它们之间的相互作用是不确定的。

答案 1 :(得分:0)

这对我有用。

WebElement element = driver.findElement(By.xpath("element xpath"));
Locatable hoverItem = (Locatable) element;
Mouse mouse = ((HasInputDevice) driver).getMouse();
mouse.mouseMove(hoverItem.getCoordinates());