【问题标题】:Selenium Hover elements with IESelenium Hover 元素与 IE
【发布时间】:2023-04-06 19:04:01
【问题描述】:

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

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

我正在使用下面的代码

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

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

【问题讨论】:

  • 您使用的是哪个版本的硒?
  • IE11 仍然存在这个问题。幸运的是,下面的解决方案仍然有效:)。

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


【解决方案1】:

元素闪烁是因为 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);

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

【讨论】:

  • 谢谢吉姆。使用上面的选项闪烁停止。但后来我不得不像你说的那样将鼠标悬停在物理上。我找到了适合我的情况的解决方案。 code.google.com/p/selenium/wiki/InternetExplorerDriver 。在这里,他们说在运行测试时将鼠标路线保持在浏览器的边界内。闪烁停止,我可以点击元素。
  • 从 Selenium 2.47.1 开始,API 发生了变化。现在是 ieCapabilities.setCapability(InternetExplorerDriver.NATIVE_EVENTS, false);。
  • @StephanRauh 虽然您可能对 Java 语言绑定是正确的,但本问答明确提到的 .NET 绑定却没有。
  • @JimEvans 好的。我已将 .NET 标记添加到问题中。但我需要一个同行来审核我的更改 - 你能接受吗?
【解决方案2】:

这对我有用。

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

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2016-09-07
    • 1970-01-01
    • 2012-05-10
    • 2021-09-23
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多