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 ...
随机推荐
- Visual Studio下使用jQuery的10个技巧
广泛流行的jQuery是一个开源的,跨浏览器和兼容CSS 3的JavaScript库,你可以用它简化你的JavaScript编码任务和操作(添加,编辑和删除)HTML内容中的DOM元素,本文介绍10个 ...
- 可用fidder测试的一些安全测试点
以下是整理的一些常见的安全渗透测试点 1.用工具fidder抓包拦截篡改服务器端返回的代码,导致下级拥有对上级的访问操作权限 以下是公司开发写的用户角色权限页面跳转 修改普通角色跳转的页面为管理员跳转 ...
- iherb账户
LMJ997 23622335@qq.com yjxwly***** LUR472 13821660226@163.com linda**** LFW887 bella****
- 多标记学习--Learning from Multi-Label Data
传统分类问题,即多类分类问题是,假设每个示例仅具有单个标记,且所有样本的标签类别数|L|大于1,然而,在很多现实世界的应用中,往往存在单个示例同时具有多重标记的情况. 而在多分类问题中,每个样本所含标 ...
- maven 阿里镜像
<mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>al ...
- hexo常用命令笔记
hexo npm install -g hexo npm update -g hexo hexo init 常用 hexo n == hexo new "a new post" 新 ...
- 转:详解JMeter正则表达式(1)
1.概览 JMeter中包含范本匹配软件Apache Jakarta ORO .在Jakarta网站上有一些关于它的文档,例如a summary of the pattern matching cha ...
- ios根据文本自适应 然后 搭建类似如下效果
UIView * headView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tbSecond.size.width, 0)]; hea ...
- @InitBinde的作用
@InitBinder用于在@Controller中标注于方法,表示为当前控制器注册一个属性编辑器或者其他,只对当前的Controller有效
- 第八十六节,html5+css3pc端固定布局,网站结构,CSS选择器,完成导航
html5+css3pc端固定布局,网站结构,CSS选择器,完成导航 页面采用1280的最低宽度设计,去掉滚动条为1263像素. 项目是PC端的固定布局,会采用像素(px)单位. 网站结构语义 在没有 ...