Merhaba Arkadaşlar,
Bugün ki makalemizin konusu Selenium WebDriver ile BrowserMob Proxy kullanımı olacak. Öncelikle browserMob proxy nedir, ne iş yapar kısaca bunu anlatayım. BrowserMob, HTTP isteklerini ve yanıtları manipüle etmek, HTTP içeriğini yakalamak ve performans verilerini HAR dosyası olarak dışa aktarmaya yarayan open source bir araçtır. Aşağıdaki linkten BrowserMob Proxy dokümantasyonuna buradan da ulaşabilirsiniz. El ile Firebug, Developer Tools vb tarayıcı araçlarının network kısmından request ve response ları inceleyerek web sitenin performansını inceleyebilirsiniz. Bu makalede browsermob’u selenium ile entegre ederek HAR formatında performans verilerini yakalayacağız.
Nasıl Yapılır ?
Öncelikle aşağıda bulunan selenium, Junit (opsiyonel), browsermob-core bağımlılıkları maven projemizin pom.xml dosyasına ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<dependencies> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>net.lightbody.bmp</groupId> <artifactId>browsermob-core</artifactId> <version>2.1.1</version> </dependency> </dependencies> |
Aşağıda bulunan test projemde sahibinden.com anasayfada yüklenen “.png” lerin doğru bir şekilde yüklenip yüklenmediğinin kontrolünü yapan bir test yazdım. Kodun açıklaması aşağıdadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
public class SahibindenNetworkTest { Logger LOGGER = Logger.getLogger(SahibindenNetworkTest.class); private static WebDriver driver; private static BrowserMobProxyServer proxy; @Rule public final TestName testName = new TestName(); @Before public void init() { if (Platform.getCurrent().is(Platform.MAC)) { System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/drivers/chromedriver"); } else if (Platform.getCurrent().is(Platform.WINDOWS)) { System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir") + "/drivers/chromedriver.exe"); } proxy = new BrowserMobProxyServer(); proxy.start(); LOGGER.info("================================================================="); LOGGER.info("This Execute Browser Port --> " + proxy.getPort()); LOGGER.info("================================================================="); Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); DesiredCapabilities seleniumCapabilities = new DesiredCapabilities(); seleniumCapabilities.setCapability(CapabilityType.PROXY, seleniumProxy); driver = new ChromeDriver(seleniumCapabilities); proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT); } @Test public void testMainPagePNGLoad() { LOGGER.info("New Har --> " + testName.getMethodName()); proxy.newHar(testName.getMethodName()); driver.get("https://www.sahibinden.com/"); List<HarEntry> entries = proxy.getHar().getLog().getEntries(); entries.stream().filter(link -> link.getRequest().getUrl().contains(".png")) .forEach(png -> { LOGGER.info("[Assert] " + png.getRequest().getUrl()); Assert.assertEquals(200, png.getResponse().getStatus()); }); } @After public void tearDown() { try { Har har = proxy.getHar(); String harFilePath = System.getProperty("user.dir") + "/target/" + testName.getMethodName(); LOGGER.info("Created HAR File --> " + harFilePath); File harFile = new File(harFilePath); har.writeTo(harFile); } catch (Exception io) { io.printStackTrace(); } if (driver != null) { driver.close(); driver.quit(); driver = null; } proxy.stop(); } } |
@Before annotation daki method da BrowserMobProxyServer nesnesi oluşturuluyor ve proxy start ediliyor. Burada proxy.start method da port number girmezseniz otomatik olarak her test için farklı port da test başlayacaktır, isterseniz de aşağıdaki gibi belirttiğiniz port da testleri koşabilirsiniz.
@Test annotation daki test method da tarayıcı sahibinden.com anasayfaya gidiyor, bu arada browserMob network ü dinliyor (request ve response). Entry ler HarEntry listesine alınıyor ve sayfa yüklenirken yapılan request lerdeki url i .png içerenleri filtreleniyor. Daha sonra da response un 200 geldiğinin kontrolü yapılıyor.
@After annotation daki method da tüm ağ verilerini, sayfa kaynağıyla birlikte belirtilen path de json formatında HAR dosyasına kaydeder.
Yukarıda bulunan Json ı buradaki linkteki alana yapıştırdıktan sonra preview e tıklayarak daha anlaşılır bir şekilde de inceleyebilirsiniz.
Saygılar
Enes Aydın