有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用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. requests模拟登录

    #coding:utf-8 #author:jwong import requests import urllib2 import re from bs4 import BeautifulSoup a ...

  2. maven构建这么慢,怎么改变?

    Apache Maven是当今非常流行的项目构建和管理工具,它把开发人员从繁杂的项目依赖关系处理事务中解放出来,完全自动化管理依赖问题.在Web应用开发过程中,通常我们会用到maven的archety ...

  3. 为 ngui TweenPosition 添加 pingpongone

    //---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright © 2011-2015 T ...

  4. install webapp2 on Linux outside google app engine.

    Reference: https://webapp-improved.appspot.com/tutorials/quickstart.nogae.html Step 1: install pip S ...

  5. 百度地图api写在html上可以实现,在jsp上会出现Bmap未定义的问题

    在html上引用时用:<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0& ...

  6. spring的校验框架 @Validated & BindingResult

    controller上写法类似这样: @RequestMapping(value = "saleInfoList.json", method = RequestMethod.GET ...

  7. Busy Beavers(暴力模拟)

    由于排版问题,题目无法显示,可以到 http://7xjob4.com1.z0.glb.clouddn.com/e4872a15819b6bf9d1e5250bacc2a30b  查看 题目大意是有只 ...

  8. 版本控制器:SVN

    版本控制器:SVN 开发中的实际问题 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流--需求之一:备份! 这个项目中需要一个很复杂的功 ...

  9. 第九十二节,html5+css3移动手机端流体布局,开篇知识

    html5+css3移动手机端流体布局,开篇知识 将项目设计成移动端可访问的页面,项目采用的是流体布局.也就是宽度以百分比自适应的,因为手机的屏幕大小不一致  一.整体设计     首先 我们要了解一 ...

  10. jQuery slideDown()--向下滑动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...