使用httpclient 调用selenium webdriver

Posted 呆瓜小贼66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用httpclient 调用selenium webdriver相关的知识,希望对你有一定的参考价值。

转自:http://www.cnblogs.com/tobecrazy/p/5034408.html

 

结合上次研究的selenium webdriver potocol ,自己写http request调用remote driver代替selenium API

selenium web driver Json protocol 相关请看 http://www.cnblogs.com/tobecrazy/p/5020741.html

我这里使用的是Gson 和 httpclient

首先,起一个remote sever

 java -Dwebdriver.ie.driver="IEDriverServer.exe"   -Dwebdriver.chrome.driver="chromedriver.exe"  -jar selenium-server-standalone-2.48.0.jar

这里要用到httpclient的Post 和delete method

创建一个httpclient对象

    HttpClient httpClient = HttpClients.createDefault();

创建一个post请求

 

    JsonObject setCapability = new JsonObject();
        setCapability.addProperty("browserName","firefox");
        JsonObject capability = new JsonObject();
        capability.add("desiredCapabilities",setCapability);
        HttpPost httpPost = new HttpPost(base);

创建一个delete 请求

     url = base + sessionId ;
         HttpDelete httpDelete = new HttpDelete(url);

从respose 中获取session ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
HttpResponse response = httpClient.execute(httpPost);
 
        try {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                System.out.println("Response content length: "
                        + entity.getContentLength());
 
                String resultEntity = EntityUtils.toString(entity);
                System.out.println("Response content: " + resultEntity);
                JsonObject result= new JsonParser().parse(resultEntity).getAsJsonObject();
                JsonElement  sessionIdJson = result.get("sessionId");
                if(!sessionIdJson.isJsonNull())
                sessionId =sessionIdJson.getAsString();
                JsonElement  valueJson = result.get("value");
                 
              
                if(!valueJson.isJsonNull())
                {
                    JsonObject tm=valueJson.getAsJsonObject();
                    JsonElement elementIdJson = tm.get("ELEMENT");
                    if(elementIdJson!=null)
                    elementId=elementIdJson.getAsString();
                    
                }
              
 
            }
        } finally {
            ((Closeable) response).close();
        }

  

全部代码如下:

 

复制代码
import java.io.Closeable;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class webDriverJson {
    private static String base = "http://127.0.0.1:4444/wd/hub/session/";
    private static String elementId;
    static String sessionId = "";

    public static void main(String[] args) throws Exception, IOException {

        HttpClient httpClient = HttpClients.createDefault();
        
        JsonObject setCapability = new JsonObject();
        setCapability.addProperty("browserName","firefox");
        JsonObject capability = new JsonObject();
        capability.add("desiredCapabilities",setCapability);
        HttpPost httpPost = new HttpPost(base);
        //create session         
        postExecutor(httpClient, httpPost, capability);
 
        String url = base + sessionId + "/url";
         httpPost = new HttpPost(url);
         
        JsonObject getUrl = new JsonObject();
        getUrl.addProperty("url", "http://www.baidu.com");

        postExecutor(httpClient, httpPost, getUrl);

        //find input box
        url = base + sessionId + "/element";
        httpPost = new HttpPost(url);
        JsonObject findElement = new JsonObject();
        findElement.addProperty("using", "id");
        findElement.addProperty("value", "kw");
        postExecutor(httpClient, httpPost, findElement);

        System.out.println(elementId);
        
        url = base + sessionId + "/element/"+elementId+"/value";
        httpPost = new HttpPost(url);
        JsonObject typeElement = new JsonObject();
        
        String json = "{\\"value\\":[\\"webdriver\\"]}";
        JsonParser jp = new JsonParser();
        typeElement = (JsonObject) jp.parse(json);
     
        postExecutor(httpClient, httpPost, typeElement);
        
        //find search button
        
        url = base + sessionId + "/element";
        httpPost = new HttpPost(url);
        JsonObject findSearchButton = new JsonObject();
        findSearchButton.addProperty("using", "id");
        findSearchButton.addProperty("value", "su");
        postExecutor(httpClient, httpPost, findSearchButton);
        System.out.println(elementId);
        
        url = base + sessionId + "/element/"+elementId+"/click";
        httpPost = new HttpPost(url);
        postExecutor(httpClient, httpPost,null);
        
        //delete session
         url = base + sessionId ;
         HttpDelete httpDelete = new HttpDelete(url);
         
         

        deleteExecutor(httpClient, httpDelete);

    }

 

    /**
     * @author Young
     * @param httpClient
     * @param httpPost
     * @param jo
     * @throws UnsupportedEncodingException
     * @throws IOException
     * @throws ClientProtocolException
     */
    public static void postExecutor(HttpClient httpClient, HttpPost httpPost,
            JsonObject jo) throws UnsupportedEncodingException, IOException,
            ClientProtocolException {
        if(jo!=null)
        {
            StringEntity input = new StringEntity(jo.toString());
            input.setContentEncoding("UTF-8");
            input.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
            httpPost.setEntity(input);
        }
        
        HttpResponse response = httpClient.execute(httpPost);

        try {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                System.out.println("Response content length: "
                        + entity.getContentLength());

                String resultEntity = EntityUtils.toString(entity);
                System.out.println("Response content: " + resultEntity);
                JsonObject result= new JsonParser().parse(resultEntity).getAsJsonObject();
                JsonElement  sessionIdJson = result.get("sessionId");
                if(!sessionIdJson.isJsonNull())
                sessionId =sessionIdJson.getAsString();
                JsonElement  valueJson = result.get("value");
                
             
                if(!valueJson.isJsonNull())
                {
                    JsonObject tm=valueJson.getAsJsonObject();
                    JsonElement elementIdJson = tm.get("ELEMENT");
                    if(elementIdJson!=null)
                    elementId=elementIdJson.getAsString();
                   
                }
             

            }
        } finally {
            ((Closeable) response).close();
        }
    }

    
    /**
     * @author Young
     * @param httpClient
     * @param delete
     * @throws UnsupportedEncodingException
     * @throws IOException
     * @throws ClientProtocolException
     */
    public static void deleteExecutor(HttpClient httpClient, HttpDelete delete) throws UnsupportedEncodingException, IOException,
            ClientProtocolException {
        
        HttpResponse response = httpClient.execute(delete);

        try {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                System.out.println("Response content length: "
                        + entity.getContentLength());

                String resultEntity = EntityUtils.toString(entity);
                System.out.println("Response content: " + resultEntity);
                JsonObject result= new JsonParser().parse(resultEntity).getAsJsonObject();
                JsonElement  sessionIdJson = result.get("sessionId");
                if(!sessionIdJson.isJsonNull())
                sessionId =sessionIdJson.getAsString();
                JsonElement  valueJson = result.get("value");
                
             
                if(!valueJson.isJsonNull())
                {
                    JsonObject tm=valueJson.getAsJsonObject();
                    JsonElement elementIdJson = tm.get("ELEMENT");
                    if(elementIdJson!=null)
                    elementId=elementIdJson.getAsString();
                   
                }
             

            }
        } finally {
            ((Closeable) response).close();
        }
    }

}
复制代码

运行效果:

了解selenium 原理究竟有什么意义?

大多数人都会使用selenium去做自动化,但是不是每个人都了解selenium的原理,如果能掌握selenium原理

可以改造selenium API,使用webdriver protocol去做一些能够完善自动化测试框架的事情。、

比如,也许你在selenium自动化过程中会遇到get打开页面打不开,为了保证你脚本的健壮性,这时候你可以加入一段httprequest去获取

response的的关键值判断,如果不是2开头的可以设置refresh,再比如需要做一些准备性工作,比如环境配置也可以使用

以上是关于使用httpclient 调用selenium webdriver的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 中正确使用 HttpClient 的姿势

[Python爬虫] 之三:Selenium 调用IEDriverServer 抓取数据

使用httpClient远程调用

9使用selenium + phantomjs 模拟浏览器登录网站

在 PCL 中使用 HttpClient 进行异步调用

如何使用 HttpClient 从 Web Api 调用 PUT 方法?