代码语言:javascript复制
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() "rn";
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 }