问题:
是否可以告诉受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"); } } }