Webdriver实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装
有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用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实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装的更多相关文章
- ViewPager取消左右滑动切换功能
ViewPager取消左右滑动切换功能 最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动 IndexViewPager.java: imp ...
- Android app应用多语言切换功能实现
最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...
- ViewPager撤消左右滑动切换功能
ViewPager取消左右滑动切换功能 最近做项目要求某种情况下ViewPager不能滑动,那么我们只需要重写这个方法就可以禁止ViewPager滑动 IndexViewPager.java: imp ...
- javascript回车完美实现tab切换功能
javascript通过回车实现tab切换功能,最经有一个项目是给化工厂做的在使用的过程中需要输入大量的数据,使用的都是小键盘区,在以前都是通过excel录入数据的现在, 在网页上需要实现excel ...
- iOS应用内语言切换功能
当我们的应用仅仅面向国内用户群,一般仅支持一种语言--中文就可以了.当面向国外用户时就需要进行国际化了,不仅仅是语言的转变,也可能包括设计风格,页面布局.交互效果的转变,如微信,微博,QQ这类应用都有 ...
- JS 实现 Tab标签切换功能
Tab标签切换 效果图: HTML部分: <div class="wrap"> <ul id="tag"> < ...
- 【百度地图API】暑假放假回老家——城市切换功能
原文:[百度地图API]暑假放假回老家--城市切换功能 任务描述: 酸奶小妹放寒假啦,要从北京呼啦一下飞回重庆呢.现在百度地图API上不能直接切换城市,怎么办呢? 如何实现: 利用API先搜索到要去城 ...
- 为JQuery EasyUI 表单组件增加“焦点切换”功能
1.背景说明 在使用 JQuery EasyUI 各表单组件时,实际客户端页面元素是由 JQuery EasyUI 生成的,元素的焦点切换,虽然 Tab 键可以正常用,但顺序控制属性 tabinde ...
- vue实现tab切换功能
最近用vue做一个页面的tab功能,经过一查找资料,没用路由,也没用动态组件,完美实现了tab切换功能,效果如下 下面是代码实现,这是模板 <article id="example&q ...
随机推荐
- ubuntu 安装Matlab 解决显示中文乱码
在ubuntu 14.04中安装Matlab 2015a打开后发现中文乱码,这主要是由于JAVA中文支持问题. 解决方法如下: 进入Maltab的安装路径: 进入JRE目录: cd Matlab目 ...
- 将LibreOffice文档批量转成PDF格式
使用如下命令可以将文档一次性批量导出为pdf格式: -name -I /program/soffice.exe --headless --convert-to pdf '{}' find命令的-max ...
- C# DataRow[]转换DataTable
DataTable dt = ... DataRow[] dr = dt.Select("ID=14"); dt = dr.CopyToDataTable();
- 压测软件-Tsung.安装篇
author :James,jimingsong@vip.qq.com author :James,jimingsong@vip.qq.com since :2015-03-02 tsung介绍 ts ...
- .net导出不规则Excel
using Hamp.App.BLL; using Hamp.App.Model; using Hamp.App.Model.QualityManagement; using System; usin ...
- 清除HTML标记
public static string DropHTML(string Htmlstring) { if (string.IsNullOrEmpty(Htmlst ...
- 项目管理-SVN服务器的搭建
Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...
- ACM常用模板
数论: 中国剩余定理(互质与非互质通用版) ],r[]; int e_gcd(int a,int b,int &x,int &y) { ) { x=; y=; return a; } ...
- 不容忽略的——CSS规范
一.CSS分类方法: 公共型样式 特殊型样式 皮肤型样式 并以此顺序引用 <link href="assets/css/global.css" rel="style ...
- 谷歌Dremel即时数据分析解决方案
Hadoop技术已经无处不在.不管是好是坏,Hadoop已经成为大数据的代名词.短短几年间,Hadoop从一种边缘技术成为事实上的标准.看来,不仅现在Hadoop是企业大数据的标准,而且在未来,它的地 ...