Selenium Java菜单及嵌套子菜单点击测试实现问题咨询
递归遍历多级菜单实现方案
你当前的代码仅支持两层菜单的遍历,想要支持任意层级的嵌套菜单点击,用递归函数就可以实现,核心逻辑是每次点击菜单项后判断是否存在子菜单,存在则调用自身处理子菜单层级,不存在则结束当前项的逻辑。
优化后完整代码
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.util.List; public class MenuTest { private WebDriver driver; private WebDriverWait wait; // 递归遍历菜单的通用方法 public void clickAllMenus(String parentMenuCss, String subMenuCss) { // 每次重新获取当前层级的菜单元素,避免DOM刷新导致元素失效 List<WebElement> menuList = driver.findElements(By.cssSelector(parentMenuCss)); int menuCount = menuList.size(); for (int i = 0; i < menuCount; i++) { // 重新获取元素,防止前一次点击导致DOM变化元素失效 menuList = driver.findElements(By.cssSelector(parentMenuCss)); WebElement currentMenu = menuList.get(i); currentMenu.click(); // 等待页面标题加载,和原有逻辑保持一致 wait.until(ExpectedConditions.visibilityOfElementLocated(By.tagName("h1"))); // 判断当前菜单下是否存在子菜单 List<WebElement> subMenuList = driver.findElements(By.cssSelector(subMenuCss)); if (!subMenuList.isEmpty()) { // 存在子菜单,递归调用方法遍历子菜单层级 clickAllMenus(subMenuCss + " a", subMenuCss); } } } // 调用示例 public void traverseAllMenus() { // 顶级菜单选择器沿用你原有代码的规则,子菜单选择器也用你原有的.docs>li clickAllMenus("#box-apps-menu li a", ".docs>li"); } }
逻辑说明
- 递归函数
clickAllMenus会自动处理所有层级的菜单,不管嵌套多少层子菜单都能完整遍历 - 每次循环都重新获取元素列表,解决页面跳转、DOM刷新导致的元素失效问题,和你原有写法的兼容逻辑一致
- 增加了子菜单存在性判断,只有子菜单列表非空时才会进入子层级遍历,不会出现空指针或者无效循环问题
适配调整提示
如果你的页面子菜单的CSS选择器规则和当前示例不同,只需要修改traverseAllMenus方法中传入的两个选择器参数即可,不需要改动递归的核心逻辑。
内容的提问来源于stack exchange,提问作者S K
相关产品推荐
相关产品推荐

