Selenium 悬停代码适用于 Chrome 而不是 Edge

Selenium hover code works in Chrome not Edge

public void Hover()
{
    Actions action = new Actions(BrowserWindow.Instance.Driver);
    action.MoveToElement(WebElement).Perform();
}

这在 Chrome 中有效。不是边缘。我已与开发人员确认我 "hovering" 对的是正确的元素。

WebElement elem = yourWebDriverInstance.findElement(By.xpath("//*[@class='goog-menu goog-menu-vertical uploadmenu density-tiny']/input"));
String js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';";

((JavascriptExecutor) yourWebDriverInstance).executeScript(js, elem);

这也失败了。有人知道我做错了什么吗?

更多信息。

这在 Firefox 上也失败了。我看到一篇关于过时的 selenium 驱动程序的文章。我刚刚安装了 geckodriver,并根据文档将 Edge 驱动程序设置为自动更新。我不相信我有过时的驱动程序。

更多信息取 2

调用代码为

public static void DoCloseActiveTabEntire()
{
    Element tab = new Element(byTab);
    tab.Hover();

    // CLose button is not clickable. Cannot use standard BUTTON for find
    Button close = new Button(byClosePanelButton);
    close.Click();
}

如果我在按钮关闭处设置一个断点...悬停尝试后,我注意到将鼠标移到 "tab" 上也不会导致按钮可见。

这很奇怪。但是替换

action.MoveToElement(WebElement).Perform();

action.MoveToElement(WebElement).Build().Perform();

并且有效。我读到 Build 内置于 Perform 中。但我只是拍打它希望有什么东西掉下来。它奏效了。

perform()

perform() 是无需先调用 build() 即可执行操作的便捷方法。


build()

build() 生成一个复合动作,其中包含到目前为止的所有动作,准备执行,此外还重置内部构建器状态,因此对 build() 的后续调用将包含新序列。


这个用例

在您的用例中,您在 moveToElement(WebElement) 之后调用了 perform(),但没有生成要使用 build() 执行的复合操作。


解决方案

一个直接的解决方案是在 perform() 之前调用 build(),如下所示:

public void Hover()
{
    Actions action = new Actions(BrowserWindow.Instance.Driver);
    action.moveToElement(WebElement).build().perform();
}

所以,我不知道为什么我认为 build().perform() 完成了这项工作。我知道它曾经工作过。我最后做的是保持悬停代码不变。

        public void Hover()
    {
        Actions action = new Actions(BrowserWindow.Instance.Driver);
        action.MoveToElement(WebElement).Build().Perform();
        Thread.Sleep(1000);

    }

我更改了尝试关闭 panel/page 的调用代码,无论我想怎样调用它:

        public static void DoCloseActiveTabEntire()
    {
        // So there is a defect in EDGE whereby the behavior of the code containted in the hover on the tab executes without
        // error but the action underneath does not occur. So in Edge, callng the hover method of the TAB as seen in the else condition 
        // below does nto display the CLOSE button which needs to be clicked.
        // So for Edge, javascript is used to display the button directly.
        IWebElement close;

        if (BrowserWindow.Instance.Browser == BrowserWindow.Browsers.Edge)
        {
            close = BrowserWindow.Instance.Driver.FindElement(byClosePanelButton);
            string js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible'; arguments[0].style.display='inline';";
            IWebDriver driver = BrowserWindow.Instance.Driver;
            IWebElement element = close;
            ((IJavaScriptExecutor)driver).ExecuteScript(js, element);
        }
        else
        {
            Element tab = new Element(byTab);
            tab.Hover();
            close = new Button(byClosePanelButton).WebElement;
        }
        close.Click();
    }

对我来说,很高兴这件事能被关闭。我不太在乎悬停是否实现了它。