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/firefox (NodeJS) 设置 userAgent