5

问题:

是否可以告诉由 selenium webdriver 控制的浏览器不从外部源加载任何内容,或者不从给定的域列表中加载资源?

背景:

我有一个网页,我用 selenium webdriver 编写了一个基于 java 的测试脚本——我无法更改页面,我只需要编写测试。网站从另一个域加载的一些外部内容存在问题。外部的东西是我的测试实际上不需要的一些javascript代码,但有问题的页面包括。现在的问题。有时外部资源非常慢,阻止 webdriver 在给定的页面加载超时(20 秒)内加载页面。我的测试实际上会运行良好,因为页面实际上已加载 - 所有 html 都在那里,所有内部脚本都已加载并且可以工作。

关于这个的随机想法:

有针对不同浏览器的扩展可以满足我的要求,但我需要使用几种浏览器运行我的测试,即 chrome、firefox 和 phantomjs。并且没有像 phantomjs 扩展这样的东西。如果可能的话,我需要一个纯粹基于 webdriver 技术的解决方案。不过,我愿意为每个浏览器编写一个单独的解决方案。

我很感激任何关于如何解决这个问题的想法。

4

2 回答 2

7

解决方案是使用代理。Webdriver 与 browsermob 代理集成得非常好:http: //bmp.lightbody.net/

private WebDriver initializeDriver() throws Exception {
    // Start the server and get the selenium proxy object
    ProxyServer server = new ProxyServer(proxy_port);  // package net.lightbody.bmp.proxy

    server.start();
    server.setCaptureHeaders(true);
    // Blacklist google analytics
    server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 410);
    // Or whitelist what you need
    server.whitelistRequests("https?://*.*.yoursite.com/.*. https://*.*.someOtherYourSite.*".split(","), 200);

    Proxy proxy = server.seleniumProxy(); // Proxy is package org.openqa.selenium.Proxy

    // configure it as a desired capability
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(CapabilityType.PROXY, proxy);

    // start the driver   ;
    Webdriver driver = new FirefoxDriver(capabilities);

    return driver;
}

编辑:人们经常要求 http 状态代码,您可以使用代理轻松检索它们。代码可以是这样的:

// create a new har with given label
public void setHar(String label) {
    server.newHar(label);
}

public void getHar() throws IOException {
    // FIXME : What should be done with the this data?
    Har har = server.getHar();
    if (har == null) return;
    File harFile = new File("C:\\localdev\\bla.har");
    har.writeTo(harFile);
    for (HarEntry entry : har.getLog().getEntries()) {
        // Check for any 4XX and 5XX HTTP status codes
        if ((String.valueOf(entry.getResponse().getStatus()).startsWith("4"))
                || (String.valueOf(entry.getResponse().getStatus()).startsWith("5"))) {
            log.warn(String.format("%s %d %s", entry.getRequest().getUrl(), entry.getResponse().getStatus(),
                    entry.getResponse().getStatusText()));
            //throw new UnsupportedOperationException("Not implemented");
        }
    }
}
于 2013-09-16T11:49:02.600 回答
1

您可以链接代理,没有太多关于这样做的文档:

http://www.nerdnuts.com/2014/10/browsermob-behind-a-corporate-proxy/

我们能够使用以下代码在公司代理后面使用 browsermob:

// start the proxy
server = new ProxyServer(9090);
server.start();

server.setCaptureContent(true);
server.setCaptureHeaders(true);
server.addHeader(“accept-encoding”, “”);//turn off gzip

// Configure proxy server to use our network proxy
server.setLocalHost(InetAddress.getByName(“127.0.0.1″));

/**
 * THIS IS THE MAJICK!
 **/
HashMap<String, String> options = new HashMap<String, String>();
options.put(“httpProxy”, “172.20.4.115:8080″);
server.setOptions(options);
server.autoBasicAuthorization(“172.20.4.115″, “username”, “password”);

// get the Selenium proxy object
Proxy proxy = server.seleniumProxy();
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
capabilities.setCapability(CapabilityType.PROXY, proxy);
于 2014-12-12T22:00:10.833 回答