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 ...
随机推荐
- WIN7x64+VS2010+OpenCV2.4.10+cmake3.5.0重新编译OpenCV
1,参考博文 Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV [OpenCV入门教程之七] 玩转OpenCV源代码:生成OpenCV工程解决 ...
- sim808模块收发送短信
一,简介 SIM 808发送短信分text模式和PDU模式.text模式已ascii码发送短信,这种模式比较简单,发送命令AT+CMGF=1就可以发送短信,而PDU模式比较复杂,首先发送命令AT+CM ...
- Java之JSP基础语法
1.JSP页面元素简介及page指令 2.JSP注释,3种不同注释 <!-- 我是HTML注释,在客户端可见 --> <%--我是JSP注释,在客户端不可见 --%> ...
- Dynamics CRM 相关资料
links: 1.The Microsoft Dynamics CRM Team Blog 2.申请试用Dynamics CRM 2013 http://www.microsoft.com/zh-cn ...
- x264中的帧类型、条带类型、数据分区(data partition)
1 条带类型(slice type) x264的条带有三种基本类型分别为:I(主要用于帧内图像编码).P(用于帧间前向参考预测图像编码).B(用于帧间双向参考预测图像编码).SI与SP(切换码流时用) ...
- nginx trouble shooting
除去配置语法失误.逻辑失误 nginx中的大部分问题都是前端到后端联通性 curl 域名没反应 cyr@test:/etc/nginx/sites-enabled$ curl test.hehe.ex ...
- assembly打包实例
1.先在pom.xml文件中添加assembly打包插件 <build> <plugins> <plugin> <groupId>org.apache. ...
- python Redis
Redis非关系型数据库,可以做消息队列功能,可以实现订阅功能,类似于广播,只要订阅道这个频道,发消息的时候,别人可以收到消息,做监控的时候,所有的客户端往一个频道上发消息,server端只有一个监听 ...
- JQuery $ $.extend(),$.fn和$.fn.extend javaScript对象、DOM对象和jQuery对象及转换 工具方法(utility)
一.为什么jquery前面要写$ Javascript没有package的概念,而作者又希望所有jQuery相关的API都能通过一个全局性的对象来容纳. 名为jQuery的全局变量就是这样一个对象,不 ...
- dump报文转换为wrieshark报文
我们开发中经常会出原始的报文,如下所示: 45 00 01 3d 8e 6a 00 00 80 11 ab 46 00 00 00 00 ff ff ff ff 00 44 00 43 01 29 6 ...