Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能

Posted

技术标签:

【中文标题】Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能【英文标题】:Selenium-Webdriver (Java) failing to execute 'hoverover and click' function consistently 【发布时间】:2015-10-25 05:08:11 【问题描述】:

我正在尝试访问应用程序中的屏幕,当我将鼠标悬停在选项卡上并单击其中一个选项时会出现该屏幕。我使用 Actions 方法使用 selenium 执行此操作。这是我的代码:

element=driver.findElement(By.id("tab"));
Actions hoverover=new Actions(driver);
hoverover.moveToElement(element).moveToElement(driver.findElement(By.id("menu"))).click().build().perform();

当我登录应用程序并直接调用此选项卡时,我可以毫无问题地访问它。但是当我从应用程序中的不同屏幕访问此选项卡时,就会出现问题。

每当我从应用程序中的不同页面访问悬停页面时,有时页面会正确加载,但大多数时候会失败,并且我会收到“没有此类元素”或“过时元素引用”错误。

我真的不确定它有时如何能够毫无问题地访问选项卡,以及有时它如何引发错误。请在此处指导我并让我知道是否还有其他功能(任何其他功能/或 Actions 的替代方法?)我可以这样做,以便鼠标悬停单击始终有效。

编辑:我尝试同时使用显式和隐式等待,甚至 thread.sleep,但徒劳无功。在 Chrome 中(仅在 chrome 中),当我在尝试访问选项卡时进行手动屏幕刷新时,它可以工作。但是当我在我的代码 [driver.navigate().refresh()] 中执行相同操作时,它不起作用!!

【问题讨论】:

您是否尝试过显式等待元素加载? 对不起!忘了在问题中提到这一点。现在添加。不,显式等待元素加载在这里也不起作用。 【参考方案1】:

陈旧元素异常可能发生在设置元素和悬停之间。 Selenium 执行以下操作:

WebElement element = driver.findElement(By.id("tab"));
// "element" has been set
Actions hoverover=new Actions(driver);
// Between here and hoverover, "element" has changed on the DOM
hoverover.moveToElement(element).moveToElement(
    driver.findElement(By.id("menu"))).click().build().perform();
// Uh-oh, what's "element?" Better throw an exception!

尝试消除 element= 行并将 driver.findElement 移动到 moveToElement() 的内部。

Actions hoverover = new Actions(driver);
hoverover.moveToElement(driver.findElement(By.id("tab")))
    .moveToElement(driver.findElement(By.id("menu"))).click().build().perform();

您也可以尝试在将鼠标悬停在选项卡和菜单上之间添加一个 WebDriverWait。

hoverover.moveToElement(driver.findElement(By.id("tab"))).build().perform();
new WebDriverWait(driver, 10))
    .until(ExpectedConditions.presenceOfElementLocated(By.id("menu")));
hoverover.moveToElement(driver.findElement(By.id("menu"))).click().build().perform();

【讨论】:

以上是关于Selenium-Webdriver (Java) 无法始终执行“悬停和单击”功能的主要内容,如果未能解决你的问题,请参考以下文章

Selenium-WebDriver自学Selenium-RC脚本编写

selenium-webdriver 简单教程

Selenium-Webdriver:找到元素后获取属性

使用 selenium-webdriver/firefox (NodeJS) 设置 userAgent

如何修复 selenium-webdriver 错误 - $ 未定义?

如何在 selenium-webdriver 中为 phantomjs 驱动程序设置一个用户代理?