package integration.proxy; import com.codeborne.selenide.Configuration; import com.codeborne.selenide.WebDriverRunner; import integration.IntegrationTest; import io.netty.handler.codec.http.HttpResponse; import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.BrowserMobProxyServer; import net.lightbody.bmp.client.ClientUtil; import net.lightbody.bmp.filters.ResponseFilter; import net.lightbody.bmp.util.HttpMessageContents; import net.lightbody.bmp.util.HttpMessageInfo; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.Proxy; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import static com.codeborne.selenide.Condition.text; import static com.codeborne.selenide.Selenide.$; import static com.codeborne.selenide.Selenide.close; import static com.codeborne.selenide.WebDriverRunner.isHtmlUnit; import static com.codeborne.selenide.WebDriverRunner.isPhantomjs; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.*; import static org.junit.Assume.assumeFalse; /** * Selenide runs its own proxy server. * User can also configure Selenide to use his proxy server (for Selenide, this is "chained" proxy). * * This test verifies that both these proxies work well together. */ public class ChainedProxyTest extends IntegrationTest { static BrowserMobProxy chainedProxy; List<String> visitedUrls = new ArrayList<>(); @Before public void setUp() throws UnknownHostException { assumeFalse(isPhantomjs()); // Why it's not working? It's magic for me... assumeFalse(isHtmlUnit()); // Why it's not working? It's magic for me... if (chainedProxy == null) { close(); chainedProxy = new BrowserMobProxyServer(); chainedProxy.setTrustAllServers(true); chainedProxy.start(0); chainedProxy.addResponseFilter(new ResponseFilter() { @Override public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) { if (messageInfo.getUrl().startsWith(Configuration.baseUrl)) { visitedUrls.add(messageInfo.getUrl()); } } }); Proxy seleniumProxy = ClientUtil.createSeleniumProxy(chainedProxy); WebDriverRunner.setProxy(seleniumProxy); } visitedUrls.clear(); } @AfterClass public static void tearDown() { WebDriverRunner.setProxy(null); close(); if (chainedProxy != null) { chainedProxy.stop(); } } @Test public void selenideProxyCanWorkWithUserProvidedChainedProxy() { openFile("file_upload_form.html"); $("#cv").uploadFromClasspath("hello_world.txt"); $("#avatar").uploadFromClasspath("firebug-1.11.4.xpi"); $("#submit").click(); // Assert that files are actually uploaded via 2 proxies $("h3").shouldHave(text("Uploaded 2 files")); assertEquals(2, server.uploadedFiles.size()); // Assert that "chained" proxy has intercepted requests assertTrue("Expected at least 2 urls, but got: " + visitedUrls, visitedUrls.size() >= 2); assertThat(visitedUrls.get(0), containsString("/file_upload_form.html")); assertThat(visitedUrls.get(visitedUrls.size() - 1), containsString("/upload")); } }