5

我有一个 HTMLdiv标签,并且在 div 内有一个元素,当鼠标进入其边界时会出现在其中。现在我想单击鼠标进入或悬停时可见的元素。

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

我正在使用下面的代码

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

有什么建议为什么它会闪烁吗?

4

2 回答 2

18

由于 IE 驱动程序的一项称为“持久悬停”的功能,该元素正在闪烁。此功能的价值值得怀疑,但由于 IE(浏览器,而不是驱动程序)在使用API时响应WM_MOUSEMOVE消息的脑死方式而需要此功能。SendMessage

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

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

请注意,尽管当您尝试悬停时,这会使您对物理鼠标光标在屏幕上的位置产生兴趣。如果这不可接受,您可以采取其他几种方法。首先,您可以关闭所谓的“本机事件”,这将导致驱动程序仅依赖于合成的 JavaScript 事件。由于仅依靠 JavaScript 来合成鼠标事件,这种方法有其自身的缺陷。

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

最后,您可以从使用默认SendMessageWindows API 迁移到使用更正确SendInputAPI 的代码。这是通过RequireWindowFocus财产完成的。它的缺点是鼠标输入在系统中的注入级别很低,这就要求IE窗口是系统上的前台窗口。

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

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

于 2013-10-29T15:25:44.847 回答
0

这对我有用。

WebElement element = driver.findElement(By.xpath("element xpath"));
Locatable hoverItem = (Locatable) element;
Mouse mouse = ((HasInputDevice) driver).getMouse();
mouse.mouseMove(hoverItem.getCoordinates());
于 2016-05-19T17:47:16.657 回答