在无头模式下使用selenium web-driver API,我试图在菜单项上执行鼠标悬停;以便显示所有子菜单项。之后,我单击其中一个子菜单项。以下是代码段:
Actions actions = new Actions(driver);
WebDriverWait wait = new WebDriverWait(driver, 20);
//Waiting for menu item to be clickable
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(menu_item)));
WebElement firstLink = driver.findElement(By.cssSelector(menu_item));
//Hovering over the menu item
actions.moveToElement(firstLink).build().perform();
//Waiting for the sub-menu item to be clickable - ERRORS OUT HERE
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(submenu_item)));
//Getting the second link
WebElement secondLink = driver.findElement(By.cssSelector(submenu_item));
//Click on sub menu
actions.moveToElement(secondLink).click().build().perform();
但是,测试超时说无法找到子菜单项。
我已经验证上述功能与Firefox驱动程序完全匹配。 此外,css选择器是正确的。
PhantomJs和鼠标悬停操作是否存在任何已知问题 - 这可能解释了为什么代码不能与PhantomJs驱动程序一起运行。如果是这样,是否有相同的解决办法。
此外,是否有更好的方法对API进行排序以模拟鼠标悬停然后单击操作?
(注意:我也试过按How to perform mouseover function in Selenium WebDriver using Java?中的提法链接操作,但没有帮助)
答案 0 :(得分:0)
尝试使用非原生JavascriptExecutor:
public void mouseHoverJScript(WebElement HoverElement) {
String mouseOverScript = "if(document.createEvent){var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false); arguments[0].dispatchEvent(evObj);} else if(document.createEventObject) { arguments[0].fireEvent('onmouseover');}";
((JavascriptExecutor) driver).executeScript(mouseOverScript,
HoverElement);
}