防止在selenium webdriver测试中加载外部内容

问题是:

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

底色:

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

随便想一想:

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

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

解决方案是使用代理。 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"); } } } 

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

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 options = new HashMap(); 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);