Java tutorial
/* * Copyright (c) 2002-2017 Gargoyle Software Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.gargoylesoftware.htmlunit; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import org.junit.Test; import org.junit.runner.RunWith; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import com.gargoylesoftware.htmlunit.BrowserRunner.Alerts; /** * Unit tests for {@link BrowserVersion}. * For some details on IE view you can have a look at * http://blogs.msdn.com/b/ieinternals/archive/2009/07/01/ie-and-the-accept-header.aspx * * @author Ronald Brill * @author Frank Danek */ @RunWith(BrowserRunner.class) public class BrowserVersion2Test extends WebDriverTestCase { /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", CHROME = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", IE = "Accept: text/html, application/xhtml+xml, */*") public void acceptHeaderGetUrl() throws Exception { final String html = "<html><body>Response</body></html>"; loadPage2(html); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, CHROME = { "2", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, IE = { "2", "Accept: text/html, application/xhtml+xml, */*" }) public void acceptHeaderWindowOpen() throws Exception { String html = "<html><body>Response</body></html>"; getMockWebConnection().setDefaultResponse(html); html = "<html><head><title>First</title></head>\n" + "<body>\n" + " <a id='clickme' href='javascript: window.open(\"" + URL_SECOND + "\")'>Click me</a>\n" + "</body></html>"; final WebDriver driver = loadPage2(html); driver.findElement(By.id("clickme")).click(); // because real browsers are doing the open async, we have to be a bit patient Thread.sleep(DEFAULT_WAIT_TIME); assertEquals(getExpectedAlerts()[0], Integer.toString(getMockWebConnection().getRequestCount())); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); shutDownRealIE(); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" }, CHROME = { "2", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, IE = { "2", "Accept: text/html, application/xhtml+xml, */*" }) public void acceptHeaderAnchorClick() throws Exception { String html = "<html><body>Response</body></html>"; getMockWebConnection().setDefaultResponse(html); html = "<html><head><title>First</title></head>\n" + "<body>\n" + " <a id='clickme' href='test.html'>Click me</a>\n" + "</body></html>"; final WebDriver driver = loadPage2(html); driver.findElement(By.id("clickme")).click(); assertEquals(getExpectedAlerts()[0], Integer.toString(getMockWebConnection().getRequestCount())); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", CHROME = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", IE = "Accept: text/html, application/xhtml+xml, */*") public void acceptHeaderAnchorClickWithType() throws Exception { String html = "<html><body>Response</body></html>"; getMockWebConnection().setDefaultResponse(html); html = "<html><head><title>First</title></head>\n" + "<body>\n" + " <a id='clickme' href='test.html' type='text/plain'>Click me</a>\n" + "</body></html>"; final WebDriver driver = loadPage2(html); driver.findElement(By.id("clickme")).click(); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: image/png,image/*;q=0.8,*/*;q=0.5", CHROME = "Accept: image/webp,image/*,*/*;q=0.8", IE = "Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5") public void acceptHeaderImage() throws Exception { final String html = "<html><head>\n" + "<script>\n" + " function doTest() {\n" // force access + " document.getElementById('anImage').height;\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + " <img src='foo.gif' id='anImage'/>\n" + "</body></html>"; loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: text/css,*/*;q=0.1", IE = "Accept: text/css, */*") public void acceptHeaderCss() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet' type='text/css'>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: */*", IE = "Accept: application/javascript, */*;q=0.8") public void acceptHeaderJavascript() throws Exception { final String html = "<html><head>\n" + " <script src='test.js' type='text/javascript'></script>\n" + "</head>\n" + "<body>\n" + "</body></html>"; loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: */*", IE = "Accept: application/javascript, */*;q=0.8") public void acceptHeaderJavascriptWithoutType() throws Exception { final String html = "<html><head>\n" + " <script src='test.js'></script>\n" + "</head>\n" + "<body>\n" + "</body></html>"; loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = "Accept: text/css,*/*;q=0.1", IE = "Accept: text/css, */*") public void acceptHeaderCssWithoutType() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet'>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/css,*/*;q=0.1" }, IE = { "2", "Accept: text/css, */*" }) public void acceptHeaderCssEmptyType() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet' type=''>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; final int requests = getMockWebConnection().getRequestCount(); loadPage2(html); final int count = Integer.parseInt(getExpectedAlerts()[0]); assertEquals(count, getMockWebConnection().getRequestCount() - requests); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/css,*/*;q=0.1" }, IE = { "2", "Accept: text/css, */*" }) public void acceptHeaderCssBlankType() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet' type=' '>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; final int requests = getMockWebConnection().getRequestCount(); loadPage2(html); final int count = Integer.parseInt(getExpectedAlerts()[0]); assertEquals(count, getMockWebConnection().getRequestCount() - requests); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/css,*/*;q=0.1" }, CHROME = { "1", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, IE = { "2", "Accept: text/css, */*" }) public void acceptHeaderCssDifferentType() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet' type='text/html'>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; final int requests = getMockWebConnection().getRequestCount(); loadPage2(html); final int count = Integer.parseInt(getExpectedAlerts()[0]); assertEquals(count, getMockWebConnection().getRequestCount() - requests); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); } /** * @throws Exception if an error occurs */ @Test @Alerts(DEFAULT = { "2", "Accept: text/css,*/*;q=0.1" }, CHROME = { "1", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, IE = { "2", "Accept: text/css, */*" }) public void acceptHeaderCssWrongType() throws Exception { final String html = "<html><head>\n" + " <link href='test.css' rel='stylesheet' type='css'>\n" + "<script>\n" + " function doTest() {\n" // force access + " var b = document.body;\n" + " window.getComputedStyle(b, null);\n" + "}\n" + "</script></head>\n" + "<body onload='doTest()'>\n" + "</body></html>"; final int requests = getMockWebConnection().getRequestCount(); loadPage2(html); final int count = Integer.parseInt(getExpectedAlerts()[0]); assertEquals(count, getMockWebConnection().getRequestCount() - requests); assertEquals(getExpectedAlerts()[1], acceptHeaderString()); } /** * @throws Exception if the test fails */ @Test @Alerts(DEFAULT = "Accept: */*", FF = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") public void acceptHeaderXMLHttpRequest() throws Exception { final String html = "<html>\n" + " <head>\n" + " <title>XMLHttpRequest Test</title>\n" + " <script>\n" + " function test() {\n" + " var request = new XMLHttpRequest();\n" + " request.open('GET', '" + URL_SECOND + "', false);\n" + " request.send('');\n" + " }\n" + " </script>\n" + " </head>\n" + " <body onload='test()'>\n" + " </body>\n" + "</html>"; final String xml = "<xml>\n" + "<content>blah</content>\n" + "<content>blah2</content>\n" + "</xml>"; getMockWebConnection().setDefaultResponse(xml); loadPage2(html); assertEquals(2, getMockWebConnection().getRequestCount()); assertEquals(getExpectedAlerts()[0], acceptHeaderString()); } private String acceptHeaderString() { final WebRequest lastRequest = getMockWebConnection().getLastWebRequest(); final Map<String, String> headers = lastRequest.getAdditionalHeaders(); final StringBuilder sb = new StringBuilder(); for (final Entry<String, String> headerEntry : headers.entrySet()) { final String headerName = headerEntry.getKey(); final String headerNameLower = headerName.toLowerCase(Locale.ROOT); if ("accept".equals(headerNameLower)) { sb.append(headerName); sb.append(": "); sb.append(headerEntry.getValue()); } } return sb.toString(); } }