Как отправить http RequestHeader с помощью Selenium 2? - PullRequest
4 голосов
/ 25 июня 2011

Мне нужно было отправить запрос Http с несколькими измененными заголовками. После нескольких часов попыток найти метод, аналогичный Selenium RC Selenium.addCustomRequestHeader для Selenium 2, я сдался и использовал JavaScript для своих целей. Я ожидал, что это будет намного проще!

Кто-нибудь знает лучший метод?

Вот что я сделал:

javascript.js

var test = {
    "sendHttpHeaders": function(dst, header1Name, header1Val, header2Name, header2Val) {
        var http = new XMLHttpRequest();

        http.open("GET", dst, "false");
        http.setRequestHeader(header1Name,header1Val);
        http.setRequestHeader(header2Name,header2Val);
        http.send(null);
    }
}

MyTest.java

// ...

@Test
public void testFirstLogin() throws Exception {
    WebDriver driver = new FirefoxDriver();

    String url = System.getProperty(Constants.URL_PROPERTY_NAME);
    driver.get(url);

    // Using javascript to send http headers
    String scriptResource = this.getClass().getPackage().getName()
        .replace(".", "/") + "/javascript.js";

    String script = getFromResource(scriptResource)
            + "test.sendHttpHeaders(\"" + url + "\", \"" + h1Name
            + "\", \"" + h1Val + "\", \"" + h2Name + "\", \"" + h2Val + "\");";
    LOG.debug("script: " + script);

    ((JavascriptExecutor)driver).executeScript(loginScript);

    // ...
}

// I don't like mixing js with my code. I've written this utility method to get
// the js from the classpath
/**
 * @param src name of a resource that must be available from the classpath
 * @return new string with the contents of the resource
 * @throws IOException if resource not found
 */
public static String getFromResource(String src) throws IOException {
    InputStream is = Thread.currentThread().getContextClassLoader().
            getResourceAsStream(src);
    if (null == is) {
        throw new IOException("Resource " + src + " not found.");
    }
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);

    String line = null;
    int nLines = 0;
    while (null != (line = br.readLine())) {
        pw.println(line);
        nLines ++;
    }
    LOG.info("Resource " + src + " successfully copied into String (" + nLines + " lines copied).");
    return sw.toString();
}

// ...

Примечание: чтобы упростить этот пост, я отредактировал свой оригинальный код. Надеюсь, я не внес никаких ошибок!

Ответы [ 3 ]

3 голосов
/ 07 марта 2014

Согласно ответу Альберто, вы можете добавить модифицирующие заголовки в профиль Firefox, если вы его используете:

FirefoxDriver createFirefoxDriver() throws URISyntaxException, IOException {
    FirefoxProfile profile = new FirefoxProfile();
    URL url = this.getClass().getResource("/modify_headers-0.7.1.1-fx.xpi");
    File modifyHeaders = modifyHeaders = new File(url.toURI());

    profile.setEnableNativeEvents(false);
    profile.addExtension(modifyHeaders);

    profile.setPreference("modifyheaders.headers.count", 1);
    profile.setPreference("modifyheaders.headers.action0", "Add");
    profile.setPreference("modifyheaders.headers.name0", SOME_HEADER);
    profile.setPreference("modifyheaders.headers.value0", "true");
    profile.setPreference("modifyheaders.headers.enabled0", true);
    profile.setPreference("modifyheaders.config.active", true);
    profile.setPreference("modifyheaders.config.alwaysOn", true);

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setBrowserName("firefox");
    capabilities.setPlatform(org.openqa.selenium.Platform.ANY);
    capabilities.setCapability(FirefoxDriver.PROFILE, profile);
    return new FirefoxDriver(capabilities);
}
3 голосов
/ 27 июня 2011

К сожалению, вы не можете менять заголовки с Selenium 2. Это было осознанное решение со стороны команд, так как мы пытаемся создать среду автоматизации браузера, которая имитирует то, что может делать пользователь.

0 голосов
/ 20 апреля 2015

Я столкнулся с той же проблемой 2 недели назад. Я попробовал подход, предложенный Карлом, но мне показалось, что для выполнения этой задачи потребовалось немало «лишних усилий».

В конце концов, я использовал библиотеку fiddlerCore для размещения прокси-сервера в моем коде и просто использовал функцию встроенного прокси в веб-драйвере 2. Она работает довольно хорошо и, на мой взгляд, гораздо более интуитивно / стабильно. Более того, он работает для всех браузеров, и вы не зависите от бинарных файлов, которые вы должны хранить в своем хранилище кода.

Вот пример, сделанный на C # для Chrome (Firefox и IE очень похожи)

// Check if the server is already running
if (!FiddlerApplication.IsStarted())
{
    // Append your delegate to the BeforeRequest event
    FiddlerApplication.BeforeRequest += delegate(Fiddler.Session oS)
    {
        // Make the modifications needed - change header, logging, ...
        oS.oRequest["SM_USER"] = SeleniumSettings.TestUser;
    };
    // Startup the proxy server
    FiddlerApplication.Startup(SeleniumSettings.ProxyPort, false, false);
}

// Create the proxy setting for the browser
var proxy = new Proxy();
proxy.HttpProxy = string.Format("localhost:{0}", SeleniumSettings.ProxyPort);

// Create ChromeOptions object and add the setting
var chromeOptions = new ChromeOptions();
chromeOptions.Proxy = proxy;

// Create the driver
var Driver = new ChromeDriver(path, chromeOptions);

// Afterwards shutdown the proxy server if it's running
if (FiddlerApplication.IsStarted())
{
    FiddlerApplication.Shutdown();
}
...