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();
}
对我来说,很高兴这件事能被关闭。我不太在乎悬停是否实现了它。
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();
}
对我来说,很高兴这件事能被关闭。我不太在乎悬停是否实现了它。