文档章节

Java Selenium封装--RemoteWebElement

xxjbs001
 xxjbs001
发布于 2015/04/06 18:41
字数 1270
阅读 40
收藏 0
点赞 0
评论 0
package com.selenium.driver;
import java.sql.SQLException;
import java.util.List;
import org.json.JSONException;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.internal.Coordinates;
import org.openqa.selenium.remote.RemoteWebElement;
import org.openqa.selenium.support.ui.Select;

public class JSWebElement {
	private RemoteWebElement we = null;
	private JavascriptExecutor jse = null;
	
	public JSWebElement(){}
	
	public JSWebElement(RemoteWebElement we){
		this.we = we;
	}
	
	///
	///通过元素ID定位元素
	///
	public JSWebElement findElementById(String using) {
		try {
			return new JSWebElement((RemoteWebElement)we.findElementById(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}
	
	///
	///通过元素CSS表达式定位元素
	///
	public JSWebElement findElementByCssSelector(String using) {
		try {
			return new JSWebElement((RemoteWebElement)we.findElementByCssSelector(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}

	///
	///通过元素Xpath表达式定位元素
	///	
	public JSWebElement findElementByXPath(String using) {
		try {
			return new JSWebElement((RemoteWebElement)we.findElementByXPath(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}

	///
	///通过链接的文字定位元素
	///	
	public JSWebElement findElementByLinkText(String using) {
		try {
			return new JSWebElement((RemoteWebElement)we.findElementByLinkText(using));
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}

	///
	///通过元素DOM表达式定位元素
	///	
	public JSWebElement findElementByDom(String using) {
		try {
			JavascriptExecutor js = this.getJSE();
			WebElement we = (WebElement)js.executeScript(String.format("return %s", using));			
			return new JSWebElement((RemoteWebElement)we);
		}catch (NoSuchElementException e){
			return new JSWebElement();
		}
	}

	///
	///判断元素是否存在
	///
	public Boolean isExist(){
		if (we != null){
			return true;
		}else{
			return false;
		}
	}

	///
	///获取元素的HTML内容
	///
	public String getHtml(){
		return we.getAttribute("outerHTML");
	}

	///
	///获取元素的文本内容
	///	
	public String getText(){
		return we.getText();
	}

	///
	///获取元素的value值
	///	
	public String getValue(){
		return this.getAttribute("value");
	} 
	
	///
	///获取元素的特定属性值
	///
	public String getAttribute(String name){
		return we.getAttribute(name);
	} 
		
	///
	///向可输入元素发送内容,如:text、textarea、filefield等
	///
	public void sendKeys(String string){
		String old_bg = this.setBackground("yellow");
		try {
			Thread.sleep(800);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		we.sendKeys(string);
		this.setBackground(old_bg);
	}
	
	///
	///判断元素是否可用
	///
	public boolean isEnabled(){
		return we.isEnabled();
	}
	
	///
	///判断元素是否可见
	///
	public boolean isVisible(){
		return we.isDisplayed();
	}
	
	///
	///清空可编辑元素的内容。不可编辑元素次操作会抛异常
	///
	public void clear(){
		we.clear();
	}
	
	///
	///对元素进行点击操作
	///
	public void click(){
		we.click();
	}
	
	///
	///检查元素的特定属性值
	///
	public void checkAttr(String attribute, JSWebUtils utils) throws SQLException, JSONException
	{
		String [] attributes=attribute.split("=", 2);
		String actual = this.we.getAttribute(attributes[0]);
		if (actual == null){ actual = "null"; }
		utils.checkPointBase(actual,attributes[1]);
	}
	
	///
	///获取元素的CSS值
	///
	public String getCssValue(String name)
	{
		return we.getCssValue(name);
	}
	
	///
	///判断元素是否被选中
	///
	public boolean isSelected()
	{
		return we.isSelected();
	}	
	
	///
	///可选元素进行选中操作;如:select
	///
	public void select(String by, String value) throws Exception
	{
		if (we.getTagName().equals("select")){
			Select select = new Select(we);
			if (by.equals("index")){
				select.selectByIndex(Integer.parseInt(value));
			}else if (by.equals("value")){
				select.selectByValue(value);
			}else if (by.equals("text")){
				select.selectByVisibleText(value);				
			}
		}else{
			Exception e = new Exception("The element is not SELECT Object");
			throw e;
		}
	}
	
	///
	///对可选中元素进行取消选择操作;如:SELECT in multiple type
	///
	public void deSelect(String by, String...value) throws Exception
	{
		if (we.getTagName().equals("select")){
			Select select = new Select(we);
			if (by.equals("index")){
				select.deselectByIndex(Integer.parseInt(value[0]));
			}else if (by.equals("value")){
				select.deselectByValue(value[0]);
			}else if (by.equals("text")){
				select.deselectByVisibleText(value[0]);
			}else if (by.equals("*")){
				select.deselectAll();
			}
		}else{
			Exception e = new Exception("The element is not SELECT Object");
			throw e;
		}
	}
	
	///
	///判断下拉框是否为多选
	///
	public boolean isMultiple() throws Exception
	{
		if (we.getTagName().equals("select")){
			Select select = new Select(we);
			if (select.isMultiple()){
				return true;
			}else{
				return false;
			}
		}else{
			Exception e = new Exception("The element is not SELECT Object");
			throw e;
		}
	}	
	
	///
	///获取select的当前选中值
	///
	public String getSelectedText() throws Exception
	{
		if (we.getTagName().equals("select")){
			String text = "";
			Select select = new Select(we);
			List<WebElement> options = select.getAllSelectedOptions();
			for (WebElement w : options){
				text += w.getText() + "\r\n";
			}
			return text;
		}else{
			Exception e = new Exception("The element is not SELECT Object");
			throw e;
		}
	}
	
	///
	///判断指定项是否存在
	///
	public boolean isInclude(String name) throws Exception
	{
		if (we.getTagName().equals("select")){
			Select select = new Select(we);
			List<WebElement> options = select.getOptions();
			for (WebElement w : options){
				if (w.getText().equals(name)){
					return true;
				}
			}
			return false;
		}else{
			Exception e = new Exception("The element is not SELECT Object");
			throw e;
		}
	}
	
	///
	///获取元素的tagname
	///
	public String getTagName(){
		return we.getTagName();
	}
	
	///
	///获取元素的id
	///
	public String getId(){
		return we.getId();
	}
	
	///
	///获取元素的绝对位置
	///
	public Point getLocation(){
		return we.getLocation();
	}
	
	///
	///获取元素的出现在屏幕可见区时的位置
	///
	public Point getLocationOnScreenOnceScrolledIntoView(){
		return we.getLocationOnScreenOnceScrolledIntoView();
	}
	
	///
	///获取元素的坐标
	///	
	public Coordinates getCoordinates(){
		return we.getCoordinates();
	}
	
	///
	///获取元素的大小
	///
	public Dimension getSize(){
		return we.getSize();
	}

	///
	///提交元素所在form的内容
	///	
	public void submit()
	{
		we.submit();
	}
	
	///
	///勾选radio、checkbox
	///
	public void check(String...values) throws Exception
	{
		if (we.getTagName().equals("input")){
			if (we.getAttribute("type").equals("radio")){
				WebDriver wd = we.getWrappedDriver();
				List<WebElement> wl = wd.findElements(By.name(we.getAttribute("name")));
				if (values[0].equals("index")){
					wl.get(Integer.parseInt(values[1])).click();
				}else if (values[0].equals("value")){
					for (WebElement w : wl){
						if (w.getAttribute("value").equals(values[1])){
							w.click();
							break;
						}
					}
				}
			}else if (we.getAttribute("type").equals("checkbox")){
				if (!we.isSelected()){
					we.click();
				}	
			}else{
				Exception e = new Exception("The element is not Radio or CheckBox Object");
				throw e;				
			}
		}else{
			Exception e = new Exception("The element is not INPUT Object");
			throw e;
		}
	}
	
	///
	///取消勾选checkbox
	///
	public void unCheck() throws Exception
	{
		if (we.getTagName().equals("input") && we.getAttribute("type").equals("checkbox")){
				if (we.isSelected()){
					we.click();
				}				
		}else{
			Exception e = new Exception("The element is not CheckBox Object");
			throw e;
		}
	}
	
	///
	///checkbox、radio是否勾选
	///
	public boolean isChecked(String...values) throws Exception
	{
		if (we.getTagName().equals("input")){
			if (we.getAttribute("type").equals("radio")){
				WebDriver wd = we.getWrappedDriver();
				List<WebElement> wl = wd.findElements(By.name(we.getAttribute("name")));
				if (values[0].equals("index")){
					return wl.get(Integer.parseInt(values[1])).isSelected();
				}else if (values[0].equals("value")){
					for (WebElement w : wl){
						if (w.getAttribute("value").equals(values[1])){
							return w.isSelected();
						}
					}
				}
				return false;
			}else if (we.getAttribute("type").equals("checkbox")){
				return we.isSelected();
			}else{
				Exception e = new Exception("The element is not Radio or CheckBox Object");
				throw e;				
			}
		}else{
			Exception e = new Exception("The element is not INPUT Object");
			throw e;
		}		
	}

	///
	///把元素滚动到可视区
	///
	public void scroll()
	{
		this.focus();
	}
	
	///
	///高亮元素
	///
	public void highLight() throws InterruptedException
	{
		this.focus();
		JavascriptExecutor js = getJSE();
		String old_style = we.getAttribute("style");
		for (int i = 0; i < 3; i++) { 			 
			js.executeScript("arguments[0].setAttribute('style', arguments[1]);", this.we, "background-color: red; border: 2px solid red;" + old_style); 
			Thread.sleep(500);
			js.executeScript("arguments[0].setAttribute('style', arguments[1]);", this.we, old_style); 
			Thread.sleep(500);
		}
	}

	///
	///触发元素的特定事件
	///
	public void fireEvent(String event){
		JavascriptExecutor js = getJSE();
		js.executeScript(String.format("arguments[0].%s()", event), this.we);
	}
	
	///
	///使元素获取焦点
	///
	public void focus(){
//		this.we.sendKeys("");
		JavascriptExecutor js = getJSE();
		js.executeScript("arguments[0].focus();", this.we);
	}	
	
	///
	///对元素执行JavaScript操作;即执行元素的dom操作
	///
	public void executeJS(String commands){
		JavascriptExecutor js = getJSE();	
		String[] comandArr = commands.split(";");
		commands = "";
		for (String comand : comandArr){
			if (!comand.trim().equals("")){
				commands += String.format("arguments[0].%s;", comand);
			}
		}
		if (!commands.equals("")){
			js.executeScript(commands, this.we);
		}
	}
	
	///
	///获取原始的RemoteWebElement对象
	///
	public RemoteWebElement getNativeWebElement(){
		return this.we;
	}
		
	private JavascriptExecutor getJSE(){
		if (this.isExist()){
			if (this.jse == null){
				WebDriver wd = we.getWrappedDriver();
				this.jse = (JavascriptExecutor) wd;				
			}		
		}
		return jse;
	}
	
	private String setBackground(String color){
		JavascriptExecutor js = getJSE();
		String old_bg = we.getCssValue("background-color");
		js.executeScript("arguments[0].style.background = arguments[1];", this.we, color); 
		return old_bg;
	}		
	
}

© 著作权归作者所有

共有 人打赏支持
xxjbs001
粉丝 55
博文 298
码字总数 215621
作品 0
浦东
QA/测试工程师
2.2 Selenium 环境搭建

Java 环境搭建 下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装JDK 配置Java 环境 校验是否安装完成 控制台输入: java –version 提示版......

米阳MeYoung ⋅ 04/24 ⋅ 0

自动化测试selenium在小公司的成功实践

前言 可能提到自动化测试selenium,大家都会想到用python语言来编写脚本。但我们选择了java语言,因为我相信大部分公司java程序员比python程序员多得多。而对于很多测试人员,并不能熟练使用...

邵磊 ⋅ 06/17 ⋅ 0

java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机 ⋅ 05/16 ⋅ 0

java编程学习常见面试题及答案

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/22 ⋅ 0

有一到五年开发经验的JAVA程序员需要掌握的知识与技能!

JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用。有编程高手认为,JAVA也好C也好没什么分别,拿来就用。为什么他们能达到如此...

java高级架构牛人 ⋅ 06/02 ⋅ 0

作为一个java程序员这些技能你都知道吗?

一、Java特点 1、 面向对象 尽管受到其前辈的影响,但Java没被设计成兼容其他语言源代码的程序。这允许Java开发组自由地从零开始。这样做的一个结果是,Java语言可以更直接、更易用、更实际的...

java高级架构牛人 ⋅ 05/23 ⋅ 0

「游戏引擎Mojoc」(10)Android NDK通用JNI调用Java代码封装

Mojoc提供了一个通用的工具类,来调用Android Java代码,以实现特定平台的功能。这个工具类封装了JNI使用的繁琐细和上下文对象的获取,提供了简单直接的API专注于Java类和方法的访问,并且实...

scottcgi ⋅ 05/20 ⋅ 0

ThreadLocal源码分析

阅读原文请访问我的博客 BrightLoong's Blog 一. 简介 提醒篇幅较大需耐心。 简介来自ThreadLocal类注释 ThreadLocal类提供了线程局部 (thread-local) 变量。这些变量与普通变量不同,每个线...

BrightLoong ⋅ 05/28 ⋅ 0

Java开发每日复盘2018_0511

今天主要跟大家来分享一下「MyBatis的使用」 一句话概括: 「MyBatis」,是一种介于Java对象与数据库(MySql等)之间的用于持久化存储的框架。 使用「MyBatis」好处: 可以更高效的,基于该框...

ZeroOSTalk ⋅ 05/13 ⋅ 0

Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部