Java Selenium封装--RemoteWebElement

  1 package com.liuke.selenium.driver;
  2 
  3 import java.sql.SQLException;
  4 import java.util.List;
  5 import org.json.JSONException;
  6 import org.openqa.selenium.By;
  7 import org.openqa.selenium.Dimension;
  8 import org.openqa.selenium.JavascriptExecutor;
  9 import org.openqa.selenium.NoSuchElementException;
 10 import org.openqa.selenium.Point;
 11 import org.openqa.selenium.WebDriver;
 12 import org.openqa.selenium.WebElement;
 13 import org.openqa.selenium.interactions.internal.Coordinates;
 14 import org.openqa.selenium.remote.RemoteWebElement;
 15 import org.openqa.selenium.support.ui.Select;
 16 
 17 public class JSWebElement {
 18     private RemoteWebElement we = null;
 19     private JavascriptExecutor jse = null;
 20     
 21     public JSWebElement(){}
 22     
 23     public JSWebElement(RemoteWebElement we){
 24         this.we = we;
 25     }
 26     
 27     ///
 28     ///通过元素ID定位元素
 29     ///
 30     public JSWebElement findElementById(String using) {
 31         try {
 32             return new JSWebElement((RemoteWebElement)we.findElementById(using));
 33         }catch (NoSuchElementException e){
 34             return new JSWebElement();
 35         }
 36     }
 37     
 38     ///
 39     ///通过元素CSS表达式定位元素
 40     ///
 41     public JSWebElement findElementByCssSelector(String using) {
 42         try {
 43             return new JSWebElement((RemoteWebElement)we.findElementByCssSelector(using));
 44         }catch (NoSuchElementException e){
 45             return new JSWebElement();
 46         }
 47     }
 48 
 49     ///
 50     ///通过元素Xpath表达式定位元素
 51     ///    
 52     public JSWebElement findElementByXPath(String using) {
 53         try {
 54             return new JSWebElement((RemoteWebElement)we.findElementByXPath(using));
 55         }catch (NoSuchElementException e){
 56             return new JSWebElement();
 57         }
 58     }
 59 
 60     ///
 61     ///通过链接的文字定位元素
 62     ///    
 63     public JSWebElement findElementByLinkText(String using) {
 64         try {
 65             return new JSWebElement((RemoteWebElement)we.findElementByLinkText(using));
 66         }catch (NoSuchElementException e){
 67             return new JSWebElement();
 68         }
 69     }
 70 
 71     ///
 72     ///通过元素DOM表达式定位元素
 73     ///    
 74     public JSWebElement findElementByDom(String using) {
 75         try {
 76             JavascriptExecutor js = this.getJSE();
 77             WebElement we = (WebElement)js.executeScript(String.format("return %s", using));            
 78             return new JSWebElement((RemoteWebElement)we);
 79         }catch (NoSuchElementException e){
 80             return new JSWebElement();
 81         }
 82     }
 83 
 84     ///
 85     ///判断元素是否存在
 86     ///
 87     public Boolean isExist(){
 88         if (we != null){
 89             return true;
 90         }else{
 91             return false;
 92         }
 93     }
 94 
 95     ///
 96     ///获取元素的HTML内容
 97     ///
 98     public String getHtml(){
 99         return we.getAttribute("outerHTML");
100     }
101 
102     ///
103     ///获取元素的文本内容
104     ///    
105     public String getText(){
106         return we.getText();
107     }
108 
109     ///
110     ///获取元素的value值
111     ///    
112     public String getValue(){
113         return this.getAttribute("value");
114     } 
115     
116     ///
117     ///获取元素的特定属性值
118     ///
119     public String getAttribute(String name){
120         return we.getAttribute(name);
121     } 
122         
123     ///
124     ///向可输入元素发送内容,如:text、textarea、filefield等
125     ///
126     public void sendKeys(String string){
127         String old_bg = this.setBackground("yellow");
128         try {
129             Thread.sleep(800);
130         } catch (InterruptedException e) {
131             e.printStackTrace();
132         }
133         we.sendKeys(string);
134         this.setBackground(old_bg);
135     }
136     
137     ///
138     ///判断元素是否可用
139     ///
140     public boolean isEnabled(){
141         return we.isEnabled();
142     }
143     
144     ///
145     ///判断元素是否可见
146     ///
147     public boolean isVisible(){
148         return we.isDisplayed();
149     }
150     
151     ///
152     ///清空可编辑元素的内容。不可编辑元素次操作会抛异常
153     ///
154     public void clear(){
155         we.clear();
156     }
157     
158     ///
159     ///对元素进行点击操作
160     ///
161     public void click(){
162         we.click();
163     }
164     
165     ///
166     ///检查元素的特定属性值
167     ///
168     public void checkAttr(String attribute, JSWebUtils utils) throws SQLException, JSONException
169     {
170         String [] attributes=attribute.split("=", 2);
171         String actual = this.we.getAttribute(attributes[0]);
172         if (actual == null){ actual = "null"; }
173         utils.checkPointBase(actual,attributes[1]);
174     }
175     
176     ///
177     ///获取元素的CSS值
178     ///
179     public String getCssValue(String name)
180     {
181         return we.getCssValue(name);
182     }
183     
184     ///
185     ///判断元素是否被选中
186     ///
187     public boolean isSelected()
188     {
189         return we.isSelected();
190     }    
191     
192     ///
193     ///可选元素进行选中操作;如:select
194     ///
195     public void select(String by, String value) throws Exception
196     {
197         if (we.getTagName().equals("select")){
198             Select select = new Select(we);
199             if (by.equals("index")){
200                 select.selectByIndex(Integer.parseInt(value));
201             }else if (by.equals("value")){
202                 select.selectByValue(value);
203             }else if (by.equals("text")){
204                 select.selectByVisibleText(value);                
205             }
206         }else{
207             Exception e = new Exception("The element is not SELECT Object");
208             throw e;
209         }
210     }
211     
212     ///
213     ///对可选中元素进行取消选择操作;如:SELECT in multiple type
214     ///
215     public void deSelect(String by, String...value) throws Exception
216     {
217         if (we.getTagName().equals("select")){
218             Select select = new Select(we);
219             if (by.equals("index")){
220                 select.deselectByIndex(Integer.parseInt(value[0]));
221             }else if (by.equals("value")){
222                 select.deselectByValue(value[0]);
223             }else if (by.equals("text")){
224                 select.deselectByVisibleText(value[0]);
225             }else if (by.equals("*")){
226                 select.deselectAll();
227             }
228         }else{
229             Exception e = new Exception("The element is not SELECT Object");
230             throw e;
231         }
232     }
233     
234     ///
235     ///判断下拉框是否为多选
236     ///
237     public boolean isMultiple() throws Exception
238     {
239         if (we.getTagName().equals("select")){
240             Select select = new Select(we);
241             if (select.isMultiple()){
242                 return true;
243             }else{
244                 return false;
245             }
246         }else{
247             Exception e = new Exception("The element is not SELECT Object");
248             throw e;
249         }
250     }    
251     
252     ///
253     ///获取select的当前选中值
254     ///
255     public String getSelectedText() throws Exception
256     {
257         if (we.getTagName().equals("select")){
258             String text = "";
259             Select select = new Select(we);
260             List<WebElement> options = select.getAllSelectedOptions();
261             for (WebElement w : options){
262                 text += w.getText() + "\r\n";
263             }
264             return text;
265         }else{
266             Exception e = new Exception("The element is not SELECT Object");
267             throw e;
268         }
269     }
270     
271     ///
272     ///判断指定项是否存在
273     ///
274     public boolean isInclude(String name) throws Exception
275     {
276         if (we.getTagName().equals("select")){
277             Select select = new Select(we);
278             List<WebElement> options = select.getOptions();
279             for (WebElement w : options){
280                 if (w.getText().equals(name)){
281                     return true;
282                 }
283             }
284             return false;
285         }else{
286             Exception e = new Exception("The element is not SELECT Object");
287             throw e;
288         }
289     }
290     
291     ///
292     ///获取元素的tagname
293     ///
294     public String getTagName(){
295         return we.getTagName();
296     }
297     
298     ///
299     ///获取元素的id
300     ///
301     public String getId(){
302         return we.getId();
303     }
304     
305     ///
306     ///获取元素的绝对位置
307     ///
308     public Point getLocation(){
309         return we.getLocation();
310     }
311     
312     ///
313     ///获取元素的出现在屏幕可见区时的位置
314     ///
315     public Point getLocationOnScreenOnceScrolledIntoView(){
316         return we.getLocationOnScreenOnceScrolledIntoView();
317     }
318     
319     ///
320     ///获取元素的坐标
321     ///    
322     public Coordinates getCoordinates(){
323         return we.getCoordinates();
324     }
325     
326     ///
327     ///获取元素的大小
328     ///
329     public Dimension getSize(){
330         return we.getSize();
331     }
332 
333     ///
334     ///提交元素所在form的内容
335     ///    
336     public void submit()
337     {
338         we.submit();
339     }
340     
341     ///
342     ///勾选radio、checkbox
343     ///
344     public void check(String...values) throws Exception
345     {
346         if (we.getTagName().equals("input")){
347             if (we.getAttribute("type").equals("radio")){
348                 WebDriver wd = we.getWrappedDriver();
349                 List<WebElement> wl = wd.findElements(By.name(we.getAttribute("name")));
350                 if (values[0].equals("index")){
351                     wl.get(Integer.parseInt(values[1])).click();
352                 }else if (values[0].equals("value")){
353                     for (WebElement w : wl){
354                         if (w.getAttribute("value").equals(values[1])){
355                             w.click();
356                             break;
357                         }
358                     }
359                 }
360             }else if (we.getAttribute("type").equals("checkbox")){
361                 if (!we.isSelected()){
362                     we.click();
363                 }    
364             }else{
365                 Exception e = new Exception("The element is not Radio or CheckBox Object");
366                 throw e;                
367             }
368         }else{
369             Exception e = new Exception("The element is not INPUT Object");
370             throw e;
371         }
372     }
373     
374     ///
375     ///取消勾选checkbox
376     ///
377     public void unCheck() throws Exception
378     {
379         if (we.getTagName().equals("input") && we.getAttribute("type").equals("checkbox")){
380                 if (we.isSelected()){
381                     we.click();
382                 }                
383         }else{
384             Exception e = new Exception("The element is not CheckBox Object");
385             throw e;
386         }
387     }
388     
389     ///
390     ///checkbox、radio是否勾选
391     ///
392     public boolean isChecked(String...values) throws Exception
393     {
394         if (we.getTagName().equals("input")){
395             if (we.getAttribute("type").equals("radio")){
396                 WebDriver wd = we.getWrappedDriver();
397                 List<WebElement> wl = wd.findElements(By.name(we.getAttribute("name")));
398                 if (values[0].equals("index")){
399                     return wl.get(Integer.parseInt(values[1])).isSelected();
400                 }else if (values[0].equals("value")){
401                     for (WebElement w : wl){
402                         if (w.getAttribute("value").equals(values[1])){
403                             return w.isSelected();
404                         }
405                     }
406                 }
407                 return false;
408             }else if (we.getAttribute("type").equals("checkbox")){
409                 return we.isSelected();
410             }else{
411                 Exception e = new Exception("The element is not Radio or CheckBox Object");
412                 throw e;                
413             }
414         }else{
415             Exception e = new Exception("The element is not INPUT Object");
416             throw e;
417         }        
418     }
419 
420     ///
421     ///把元素滚动到可视区
422     ///
423     public void scroll()
424     {
425         this.focus();
426     }
427     
428     ///
429     ///高亮元素
430     ///
431     public void highLight() throws InterruptedException
432     {
433         this.focus();
434         JavascriptExecutor js = getJSE();
435         String old_style = we.getAttribute("style");
436         for (int i = 0; i < 3; i++) {              
437             js.executeScript("arguments[0].setAttribute('style', arguments[1]);", this.we, "background-color: red; border: 2px solid red;" + old_style); 
438             Thread.sleep(500);
439             js.executeScript("arguments[0].setAttribute('style', arguments[1]);", this.we, old_style); 
440             Thread.sleep(500);
441         }
442     }
443 
444     ///
445     ///触发元素的特定事件
446     ///
447     public void fireEvent(String event){
448         JavascriptExecutor js = getJSE();
449         js.executeScript(String.format("arguments[0].%s()", event), this.we);
450     }
451     
452     ///
453     ///使元素获取焦点
454     ///
455     public void focus(){
456 //        this.we.sendKeys("");
457         JavascriptExecutor js = getJSE();
458         js.executeScript("arguments[0].focus();", this.we);
459     }    
460     
461     ///
462     ///对元素执行JavaScript操作;即执行元素的dom操作
463     ///
464     public void executeJS(String commands){
465         JavascriptExecutor js = getJSE();    
466         String[] comandArr = commands.split(";");
467         commands = "";
468         for (String comand : comandArr){
469             if (!comand.trim().equals("")){
470                 commands += String.format("arguments[0].%s;", comand);
471             }
472         }
473         if (!commands.equals("")){
474             js.executeScript(commands, this.we);
475         }
476     }
477     
478     ///
479     ///获取原始的RemoteWebElement对象
480     ///
481     public RemoteWebElement getNativeWebElement(){
482         return this.we;
483     }
484         
485     private JavascriptExecutor getJSE(){
486         if (this.isExist()){
487             if (this.jse == null){
488                 WebDriver wd = we.getWrappedDriver();
489                 this.jse = (JavascriptExecutor) wd;                
490             }        
491         }
492         return jse;
493     }
494     
495     private String setBackground(String color){
496         JavascriptExecutor js = getJSE();
497         String old_bg = we.getCssValue("background-color");
498         js.executeScript("arguments[0].style.background = arguments[1];", this.we, color); 
499         return old_bg;
500     }        
501     
502 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言编程中字符串切割方法小结

1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是 []string的切片 import...

4329
来自专栏曾大稳的博客

Android OpenGLES 绘制三角形 ,四边形

OpenGL ES Shader的三种变量类型uniform,attribute和varying

3043
来自专栏Pythonista

Golang之接口(interface)

 //Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口。

3953
来自专栏Hongten

python开发_python中字符串string操作

在python中,对于字符串string的操作,我们有必要了解一下,这样在我们的以后的开发中会给我们带来很多方便

1113
来自专栏blackheart的专栏

[C#1] 7-枚举

1.Enum 枚举是定义了一组符号名称和数值对,如下: 1 //byte、sbyte、short、ushort、int、uint、long 或 ulong ...

22510
来自专栏咸鱼不闲

jsoup爬虫工具的简单使用

解决方案: 1.通过url 获得doucment对象, 2.调用select()等方法获得Elements对象, 3.调用.text()等方法,获得自己想要的内...

4784
来自专栏Golang语言社区

深入剖析Go语言编程中switch语句的使用

switch语句可以让一个变量对反对值的列表平等进行测试。每个值被称为一个的情况(case),变量被接通检查每个开关盒(switch case)。 在Go编程,...

3647
来自专栏Golang语言社区

Go语言struct类型详解

struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型person代表一个人的...

3027
来自专栏梦魇小栈

JQuery分析及实现part3之属性模块功能及实现

843
来自专栏Pythonista

golang之切片与排序

排序操作在sort包中,sort.Ints对整数进行排序,sort.Strings对字符串进行排序,sort.Float64对浮点数进行排序

772

扫码关注云+社区

领取腾讯云代金券