在做selenium自动化测试的时候,我们验证一个页面的时候,可能要经过登陆,但是验证码的值往往非常难获取到,并且登陆并不在我们单个用例的测试范围之内,所以我们希望跳过登陆,直接进行页面的测试。

我一开始的思路的不经过代理服务,直接设置cookie,通过

Cookie ck = new Cookie("Cookie",finalCookieValue);
mDriver.manage().addCookie(ck);

来实现,但是这样的操作会报错,报错信息不就不分享给大家了,大致内容就是不允许这样设置cookie。

后来的思路,通过BrowserMobProxy,代理设置hearders, 在头里设置cookie以达到越过登陆的效果。

话不多说,上代码。

package com.jd.pop.qa.base;


import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponse;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.filters.RequestFilter;
import net.lightbody.bmp.util.HttpMessageContents;
import net.lightbody.bmp.util.HttpMessageInfo;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

public class Base {
    private WebDriver mDriver;
    protected static Properties sConfig;
    protected static DesiredCapabilities capabilities;
    private static BrowserMobProxyServer server;
    String finalCookieValue;

    @BeforeTest
    public void configure() throws Exception {
        server = new BrowserMobProxyServer();
        server.start(0);

        String cookieValue = requestCookieValue("cookie.txt");//读取存放cookie的文件
        finalCookieValue = cookieValue;

        server.addRequestFilter(new RequestFilter() {
            public HttpResponse filterRequest(HttpRequest httpRequest, HttpMessageContents httpMessageContents, HttpMessageInfo httpMessageInfo) {
                httpRequest.headers().add("Cookie", finalCookieValue);
                return null;
            }
        });

        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(server);
        capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
        capabilities.setJavascriptEnabled(true);
        capabilities.setCapability(CapabilityType.TAKES_SCREENSHOT, true);
        capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        capabilities.setBrowserName("chrome");

        System.setProperty("webdriver.chrome.driver", sConfig.getProperty("chrome_driver_path"));

    }

    //处理cookie
    protected String requestCookieValue(String fileName) throws IOException {
        String absoluteFilePath = System.getProperty("user.dir") + File.separator + fileName;
        BufferedReader bufferedReader = new BufferedReader(new FileReader(absoluteFilePath));
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
        bufferedReader.close();
        return stringBuilder.toString();
    }


    @BeforeClass
    public WebDriver getDriver() {
        mDriver = new ChromeDriver(capabilities);
        //Cookie ck = new Cookie("Cookie",finalCookieValue);
        //mDriver.manage().addCookie(ck);
        mDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return mDriver;
    }

    @AfterTest
    public void tearDown() {
        server.stop();
        mDriver.quit();
    }

}

获取cookie的方式,以csdn为例

selenium设置cookie越过登陆。

调试页面,任何一个请求的header都会有cookie,把cookie粘贴下来放进txt文件里就行了。

当然这样搞也有问题,cookie是会过期的,所以要常更换cookie。

 

相关文章: