有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用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. 初级AD域渗透系列

      net group /domain 获得所有域用户组列表 net group “domain admins” /domain 获得域管理员列表 net group “enterprise admi ...

  2. 面试题-Java基础-异常部分

    1.Java中的两种异常类型是什么?他们有什么区别? Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常.不受检查的异常不需要在方法或者是构造函数上声明,就算方 ...

  3. 设置ios中imageView图片自适应,

    UIIimageView  *imageView = [UIImageView alloc]init]; [imageView setContentScaleFactor:[[UIScreen mai ...

  4. 窗口信息获取器 Spy4Win v0.20b 中文绿色版

    软件名称:窗口信息获取器 Spy4Win v0.20b 中文绿色版软件类别:国产软件运行环境:Windows XP软件语言:简体中文授权方式:免费版软件大小:1.67 MB软件等级:整理时间:2012 ...

  5. JAVA读取本地配置文件实例

    import java.io.InputStream; import java.util.Properties; public class FileProperties extends Propert ...

  6. bayboy下载安装

    badboy是jmeter工具的好搭档. 好处体现在那里呢? JMeter是纯Java编写的软件功能和性.能测试工具,其录制脚本过于笨拙和复杂. 而Badboy是用C++开发的动态应用测试工具,其拥有 ...

  7. 根据ClassName获取元素节点

    功能描述: 通过ClassName获取元素节点,并解决兼容性问题 实现效果: 编码思路: 利用getElementsByTagName选出所有元素,再根据ClassName条件进行筛选 代码示例:

  8. PLSQL 几种游标的用法

    分类: Oracle 1. PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种.所以,我们可以认为,有3种游标用法: A. 显式游 ...

  9. overthewire朝花夕拾

    bandit: cat特殊字符文件名 - cat ./- 空格 cat "abc def"  or cat abc\ def 列出隐藏文件:ll du -ab 递归列出文件大小,以 ...

  10. php curl 抓取内容

    <?php$ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$url)//抓取url curl_setopt($ch,CURLOPT_RETURNTRAN ...