有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用webdriver原生的方法去获取未知的元素进行判断,显然是不可能的,因为webdriver本身就是基于明确的元素进行定位的,如果涉及到未知元素的判断,需要调用原生js或者Jquery

一般页面效果图会如下所示:

页面HTML源码:

<li class="active"><a data-toggle="collapse" class="nav-header" href="#menuL1_3">中标目录管理</a><ul class="nav nav-list menuL2 in" id="menuL1_3" style="height: auto;"><li><a target="mainFrame" class="nav-page" href="gbc/gbcRequest/main.do">我的申请</a></li><li class="active"><a data-toggle="collapse" class="nav-sub" href="#menuL3_2_2">审核管理</a><ul class="nav nav-list menuL3 in" id="menuL3_2_2" style="height: auto;"><li><a target="mainFrame" class="nav-page" href="gbc/gbcCheckPending/main.do">待审核</a></li><li><a target="mainFrame" class="nav-page" href="gbc/gbcAudited/main.do">已审核</a></li></ul></li><li><a target="mainFrame" class="nav-page" href="gbc/gbcBiddingCatalogue/main.do">中标目录</a></li><li><a target="mainFrame" class="nav-page" href="gbc/gpoTags/main.do">标签管理</a></li><li><a target="mainFrame" class="nav-page" href="gbc/gbcPublishedHistory/main.do">发布历史记录</a></li><li><a target="mainFrame" class="nav-page" href="gbc/gbcCatLog/main.do">操作日志</a></li><li><a target="mainFrame" class="nav-page" href="gbc/gbcProcurementCatalogue/main.do">带量采购目录</a></li></ul></li>

对菜单的所有切换与点击功能进行封装:

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SelectMenue {
    private WebDriver driver;
    
/**
 *
 * @param
 * driver 构造方法参数,取所调用页面的driver
 */
    public SelectMenue(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 此方法用于只有二级菜单时的切换
     * @param
     * ParentElement 父菜单
     * @param
     * TargetElement 目标菜单
     */
    public void switchMenue(String ParentElement, String TargetElement) {
        WebDriverWait wait = new WebDriverWait(driver, 10);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        driver.switchTo().defaultContent();
        // 展开主菜单
        WebElement parentElement = driver.findElement(By.linkText(ParentElement));
        // 获取父菜单的下一个兄弟节点,并将其强制转换成WebElement类型
        WebElement brotherElement = (WebElement) js.executeScript("return arguments[0].parentNode.children[1]",
                parentElement);
        // 当父菜单不是展开状态的时候就去点击父菜单
        if (!brotherElement.isDisplayed()) {
            parentElement.click();
            // 获取所有子菜单的集合,并不包含子菜单的子元素
            List<WebElement> elements = (List<WebElement>) js.executeScript("return arguments[0].children",
                    brotherElement);
            // 等待brotherElement下所有的li标签都变成可见
            wait.until(ExpectedConditions.visibilityOfAllElements(elements));
        }
        // 点击目标菜单
        brotherElement.findElement(By.linkText(TargetElement)).click();
        // 切换到主页面
        driver.switchTo().frame("mainFrame");
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("pageNavigationBar")));
    }

    /**
     * 此方法用于有三级菜单时的切换
     * @param
     * ParentElement 父菜单
     * @param
     * SecElement 二级菜单
     * @param
     * TargetElement 目标菜单
     */
    public void switchMenue(String ParentElement, String SecElement, String TargetElement) {
        WebDriverWait wait = new WebDriverWait(driver, 10);
        JavascriptExecutor js = (JavascriptExecutor) driver;
        //调用方法的第一件事,切换到默认文本,清除所有状态
        driver.switchTo().defaultContent();
        // 展开主菜单
        WebElement parentElement = driver.findElement(By.linkText(ParentElement));
        // 获取父菜单的下一个兄弟节点,并将其强制转换成WebElement类型
        WebElement brotherElement = (WebElement) js.executeScript("return arguments[0].parentNode.children[1]",
                parentElement);
        // 当父菜单不是展开状态的时候就去点击父菜单
        if (!brotherElement.isDisplayed()) {
            parentElement.click();
            // 获取所有二级菜单的集合,并不包含二级菜单的子元素
            List<WebElement> elements = (List<WebElement>) js.executeScript("return arguments[0].children",
                    brotherElement);
            // 等待brotherElement下所有的li标签都变成可见
            wait.until(ExpectedConditions.visibilityOfAllElements(elements));
        }
        // 获取二级菜单
        WebElement secElement = brotherElement.findElement(By.linkText(SecElement));
        // 获取二级菜单的下一个兄弟节点,并将其强制转换成WebElement类型
        WebElement secBrotherElement = (WebElement) js.executeScript("return arguments[0].parentNode.children[1]",
                secElement);

        if (!secBrotherElement.isDisplayed()) {
            // 展开二级菜单
            secElement.click();
            // 等待二级菜单下的所有li标签加载完成
            wait.until(ExpectedConditions.visibilityOfAllElements(secBrotherElement.findElements(By.tagName("li"))));
        }
        // 点击目标菜单
        secBrotherElement.findElement(By.linkText(TargetElement)).click();
        // 切换到主页面
        driver.switchTo().frame("mainFrame");
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("pageNavigationBar")));
    }
}

Webdriver实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装的更多相关文章

  1. ViewPager取消左右滑动切换功能

    ViewPager取消左右滑动切换功能 最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动 IndexViewPager.java: imp ...

  2. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  3. ViewPager撤消左右滑动切换功能

    ViewPager取消左右滑动切换功能 最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动 IndexViewPager.java: imp ...

  4. javascript回车完美实现tab切换功能

    javascript通过回车实现tab切换功能,最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel ...

  5. iOS应用内语言切换功能

    当我们的应用仅仅面向国内用户群,一般仅支持一种语言--中文就可以了.当面向国外用户时就需要进行国际化了,不仅仅是语言的转变,也可能包括设计风格,页面布局.交互效果的转变,如微信,微博,QQ这类应用都有 ...

  6. JS 实现 Tab标签切换功能

    Tab标签切换 效果图: HTML部分: <div class="wrap">     <ul id="tag">       < ...

  7. 【百度地图API】暑假放假回老家——城市切换功能

    原文:[百度地图API]暑假放假回老家--城市切换功能 任务描述: 酸奶小妹放寒假啦,要从北京呼啦一下飞回重庆呢.现在百度地图API上不能直接切换城市,怎么办呢? 如何实现: 利用API先搜索到要去城 ...

  8. 为JQuery EasyUI 表单组件增加“焦点切换”功能

    1.背景说明 在使用 JQuery  EasyUI 各表单组件时,实际客户端页面元素是由 JQuery EasyUI 生成的,元素的焦点切换,虽然 Tab 键可以正常用,但顺序控制属性 tabinde ...

  9. vue实现tab切换功能

    最近用vue做一个页面的tab功能,经过一查找资料,没用路由,也没用动态组件,完美实现了tab切换功能,效果如下 下面是代码实现,这是模板 <article id="example&q ...

随机推荐

  1. c++中宽字节表示

    1.C++语言中_T Visual C++里边定义字符串的时候,用_T来保证兼容性,VC支持ascii和unicode两种字符类型,用_T可以保证从ascii编码类型转换到unicode编码类型的时候 ...

  2. EntityFramework批量Insert

    先说解决办法:使用SqlBulkCopy. 然后问题是:这个和EF没有半点关系,还要拼DataSet. 再是解决办法:你可以自己封装一个,也可以使用人家写好的 EntityFramework.Bulk ...

  3. Java中的注释

    代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率.也是程序代码可维护性的重要环节之一.所以我们不是为写注释而写注释.下面说一下Javadoc注释规范以及楼主在J2EE ...

  4. JAVA的if用法,比如if(...){} 和if()没有大括号直接写下面的区别是什么

    有大括号的时候 大括号里面所有的 都归if管.只有条件为真的时候 才会执行.没有大括号的时候 只有下面的一句归if管,也就是说 当只有一句的时候 大括号可以省略 其它的 没区别.

  5. JWT 多网站单点登录,放弃session

    多个网站之间的登录信息共享, 基于cookie - session的登录认证方式跨域等比较复杂.采用基于算法的认证方式, JWT(json web token)的方式. --------------- ...

  6. yii2.0面包屑的使用及启用中文

    (注:己yii2.0高级应用为例) 面包屑在布局里定义好之后,在视图中直接使即可,但默是使用英文. 一.布局中定义面包屑 backend/views/layout/main.php: use back ...

  7. easyui datagrid 的排序问题

    今日遇到一个datagrid排序问题,sortable,sorter函数都已设置,但是始终没有效果,无法在界面自定义排序.后来发现,需要设置remoteSort:false. 切记!!! remote ...

  8. Linux系统安装rar压缩软件

    将 hebaodans.com 目录打包为 hebaodans.rar # rar a hebaodans.rar ./hebaodans.com/ 解压 hebaodans.rar 到当前目录 # ...

  9. hadoop 读取文件的两种方式

    1.操作javaAPI方式 static{ URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); } public stat ...

  10. git 和 svn

    GIT和SVN之间的五个基本区别 如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系 ...