在做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为例
调试页面,任何一个请求的header都会有cookie,把cookie粘贴下来放进txt文件里就行了。
当然这样搞也有问题,cookie是会过期的,所以要常更换cookie。