Java Selenium封装--RemoteWebDriver

  1 package com.selenium.driver;
  2 import java.io.File;
  3 import java.io.IOException;
  4 import java.net.URL;
  5 import java.util.HashMap;
  6 import java.util.Map;
  7 import java.util.Set;
  8 import java.util.regex.Matcher;
  9 import java.util.regex.Pattern;
 10 import org.apache.commons.io.FileUtils;
 11 import org.openqa.selenium.Alert;
 12 import org.openqa.selenium.Capabilities;
 13 import org.openqa.selenium.Cookie;
 14 import org.openqa.selenium.JavascriptExecutor;
 15 import org.openqa.selenium.NoSuchElementException;
 16 import org.openqa.selenium.OutputType;
 17 import org.openqa.selenium.TakesScreenshot;
 18 import org.openqa.selenium.WebDriver;
 19 import org.openqa.selenium.WebElement;
 20 import org.openqa.selenium.remote.Augmenter;
 21 import org.openqa.selenium.remote.RemoteWebDriver;
 22 import org.openqa.selenium.remote.RemoteWebElement;
 23 public class JSWebDriver{
 24     private RemoteWebDriver wd = null;
 25     private JavascriptExecutor jse = null;
 26     
 27     public JSWebDriver(URL remoteAddress, Capabilities desiredCapabilities) {
 28         wd = new RemoteWebDriver(remoteAddress, desiredCapabilities);
 29     }
 30     
 31     ///
 32     ///浏览器url导航
 33     ///
 34     public void goTo(String url){
 35         wd.get(url);
 36     }    
 37     
 38     ///
 39     ///浏览器退出
 40     ///
 41     public void quit(){
 42         wd.quit();
 43     }
 44 
 45     ///
 46     ///浏览器后退
 47     ///
 48     public void back(){
 49         wd.navigate().back();
 50     }
 51 
 52     ///
 53     ///浏览器前进
 54     ///
 55     public void forward(){
 56         wd.navigate().forward();
 57     }
 58     
 59     ///
 60     ///浏览器刷新
 61     ///
 62     public void refresh(){
 63         wd.navigate().refresh();
 64     }
 65     
 66     ///
 67     ///切换到新浏览器窗口;按照title、url、index;支持正则匹配
 68     ///
 69     public void switchToWindow(String by, String value, String...match) throws Exception{
 70         String currenthandle = wd.getWindowHandle();
 71         Set<String> handles = wd.getWindowHandles();
 72         int currentIndex = -1;
 73         String searchString = "";
 74         for(String handle : handles){
 75             currentIndex += 1;
 76             if(handle.equals(currenthandle)){
 77                 continue;
 78             }else{                
 79                 wd.switchTo().window(handle);
 80                 if (match.length == 1 && match[0].equals("regex")){                    
 81                     if (by.equals("title")){
 82                         searchString = wd.getTitle();
 83                     }else if (by.equals("url")){
 84                         searchString = wd.getCurrentUrl();
 85                     }    
 86                     Pattern pattern = Pattern.compile(value);
 87                     Matcher matcher = pattern.matcher(searchString);
 88                     if(matcher.find()){
 89                         return;
 90                     }
 91                 }else{
 92                     if (by.equals("title")){
 93                         searchString = wd.getTitle();
 94                     }else if (by.equals("url")){
 95                         searchString = wd.getCurrentUrl();
 96                     }else if (by.equals("index")){
 97                         searchString = Integer.toString(currentIndex);
 98                     }
 99                     if(searchString.equals(value)){
100                         return;
101                     }
102                 }
103             }
104         }
105         Exception e = new Exception("Swtich Window Failed, Please Make Sure The Locator Was Right.");
106         throw e;
107     }
108     
109     ///
110     ///JS弹框确认
111     ///
112     public void clickAlertSure(){
113         Alert alert = wd.switchTo().alert();
114         alert.accept();
115     }
116     
117     ///
118     ///JS弹框取消
119     ///
120     public void clickAlertDismiss()
121     {
122         Alert alert = wd.switchTo().alert();
123         alert.dismiss();
124     }
125     
126     ///
127     ///设置prompt弹框内容
128     ///
129     public void setPromptMessage(String parameter){
130         Alert alert = wd.switchTo().alert();
131         alert.sendKeys(parameter);
132     }
133     
134     ///
135     ///获取JS弹框内容
136     ///
137     public String getPromptMessage(){
138         Alert alert = wd.switchTo().alert();
139         return alert.getText();
140     }    
141     
142     ///
143     ///切换到Frame窗口;先定位到iframe元素
144     ///
145     public void switchToFrame(JSWebElement jselement){        
146         wd.switchTo().frame(jselement.getNativeWebElement());
147     }
148 
149     ///
150     ///执行JS脚本
151     ///
152     public void executeScript(String parameter){
153         JavascriptExecutor js = getJSE();
154         js.executeScript(parameter);
155     }
156 
157     ///
158     ///获取指定cookie
159     ///
160     public String getCookie(String name){
161         Cookie cookie=wd.manage().getCookieNamed(name);
162         if (cookie == null){ return "null"; }
163         return cookie.getValue();
164     }
165     
166     ///
167     ///获取所有cookie
168     ///
169     public Map<String, String> getCookies(){
170         Map<String, String> newCookies = new HashMap<String, String>();
171         Set<Cookie> cookies= wd.manage().getCookies();
172         for (Cookie cookie : cookies){
173             newCookies.put(cookie.getName(), cookie.getValue());
174         }
175         return newCookies;
176     }
177     
178     ///
179     ///截取屏幕
180     ///
181     public void getScreen(String filepath){
182         WebDriver augmentedDriver = new Augmenter().augment(this.wd); 
183         TakesScreenshot ts = (TakesScreenshot) augmentedDriver;
184         File screenShotFile = ts.getScreenshotAs(OutputType.FILE); 
185         try { 
186             FileUtils.copyFile (screenShotFile, new File(filepath)); 
187         }catch (IOException e){ 
188             e.printStackTrace(); 
189         } 
190     }
191 
192     ///
193     ///获取title
194     ///
195     public String getTitle(){
196         return wd.getTitle();
197     }    
198 
199     ///
200     ///获取url
201     ///
202     public String getUrl(){
203         return wd.getCurrentUrl();
204     }
205     
206     ///
207     ///获取HTML源码
208     ///
209     public String getSource(){
210         try {
211             Thread.sleep(500);
212         } catch (InterruptedException e) {
213             e.printStackTrace();
214         }
215         return wd.getPageSource();
216     }
217     
218     ///
219     ///滚动页面到指定位置
220     ///
221     public void scroll(String x, String y){
222         if (x.equals("left")){
223             x = "0";
224         }else if (x.equals("right")){
225             x = "document.body.scrollWidth";
226         }else if (x.equals("middle")){
227             x = "document.body.scrollWidth/2";
228         }
229         if (y.equals("top")){
230             y = "0";
231         }else if (y.equals("buttom")){
232             y = "document.body.scrollHeight";
233         }else if (y.equals("middle")){
234             y = "document.body.scrollHeight/2";
235         }
236         this.executeScript(String.format("scroll(%s,%s);", x, y));
237     }
238     
239     ///
240     ///最大化浏览器
241     ///
242     public void maximize(){
243         wd.manage().window().maximize();
244     }
245     
246     public JSWebElement findElementById(String using) {
247         try {
248             return new JSWebElement((RemoteWebElement)wd.findElementById(using));
249         }catch (NoSuchElementException e){
250             return new JSWebElement();
251         }
252     }
253     
254     public JSWebElement findElementByCssSelector(String using) {
255         try {
256             return new JSWebElement((RemoteWebElement)wd.findElementByCssSelector(using));
257         }catch (NoSuchElementException e){
258             return new JSWebElement();
259         }
260     }
261     
262     public JSWebElement findElementByXPath(String using) {
263         try {
264             return new JSWebElement((RemoteWebElement)wd.findElementByXPath(using));
265         }catch (NoSuchElementException e){
266             return new JSWebElement();
267         }
268     }
269 
270     public JSWebElement findElementByLinkText(String using) {
271         try {
272             return new JSWebElement((RemoteWebElement)wd.findElementByLinkText(using));
273         }catch (NoSuchElementException e){
274             return new JSWebElement();
275         }
276     }
277     
278     public JSWebElement findElementByDom(String using) {
279         try {
280             JavascriptExecutor js = this.getJSE();
281             WebElement we = (WebElement)js.executeScript(String.format("return %s", using));            
282             return new JSWebElement((RemoteWebElement)we);
283         }catch (NoSuchElementException e){
284             return new JSWebElement();
285         }
286     }
287     
288     ///
289     ///获取原生的RemoteWebdriver对象
290     ///
291     public RemoteWebDriver getNativeWebDriver(){
292         return this.wd;
293     }
294     
295     private JavascriptExecutor getJSE(){
296         if (this.jse == null){
297             this.jse = (JavascriptExecutor) this.wd;                
298         }        
299         return jse;
300     }
301 }

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

如何结合IbatisNet的LIST遍历实现模糊查询

我仿照Java的Spring+Ibatis+Struct用Castle+IBatisNet+Asp.net的开发框架的DAO的基类:BaseSqlMapDao内...

25290
来自专栏函数式编程语言及工具

SDP(6):分布式数据库运算环境- Cassandra-Engine

    现代信息系统应该是避不开大数据处理的。作为一个通用的系统集成工具也必须具备大数据存储和读取能力。cassandra是一种分布式的数据库,具备了分布式数据...

35040
来自专栏编码小白

ofbiz 服务引擎(一) controller中服务的调用解析

首先根据handler-controller.xml文件中对应handler文件,然后运行RequestHandler中的runEvent方法,方法如下: /*...

38540
来自专栏码匠的流水账

聊聊storm的maxSpoutPending

storm-2.0.0/storm-client/src/jvm/org/apache/storm/Config.java

26450
来自专栏码匠的流水账

kafka0.8生产者异常处理

本文简单解析一下kafka0.8.2.2版本中的java producer的异常处理。

11810
来自专栏菩提树下的杨过

asp.net mvc中的路径选择

MVC的路径选择十分灵活,可以用类似/parm1/parm2/parm3/ 的方式(这个有点象iis的urlrewriter),也可以象传统url那样用/?pa...

22980
来自专栏前端新视界

由移动端级联选择器所引发的对于数据结构的思考

GitHub:https://github.com/nzbin/Framework7-CityPicker Demo:https://nzbin.githu...

43180
来自专栏码匠的流水账

聊聊flink的RichParallelSourceFunction

flink-streaming-java_2.11-1.6.2-sources.jar!/org/apache/flink/streaming/api/func...

33910
来自专栏函数式编程语言及工具

Akka(23): Stream:自定义流构件功能-Custom defined stream processing stages

    从总体上看:akka-stream是由数据源头Source,流通节点Flow和数据流终点Sink三个框架性的流构件(stream components)...

46180
来自专栏码匠的流水账

聊聊rocketmq的PullConsumerImpl

io/openmessaging/rocketmq/consumer/PullConsumerImpl.java

26510

扫码关注云+社区

领取腾讯云代金券