Best Selenium code snippet using org.openqa.selenium.devtools.Connection.send
Source:ChromeDevToolsNetworkTest.java
...76import static org.openqa.selenium.testing.drivers.Browser.CHROME;77public class ChromeDevToolsNetworkTest extends DevToolsTestBase {78 @Test79 public void getSetDeleteAndClearAllCookies() {80 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));81 List<Cookie> allCookies = devTools.send(getAllCookies());82 assertEquals(0, allCookies.size());83 boolean setCookie = devTools.send(setCookie(84 "name",85 "value",86 Optional.of("http://localhost/devtools/test"),87 Optional.of("localhost"),88 Optional.of("/devtools/test"),89 Optional.empty(),90 Optional.empty(),91 Optional.empty(),92 Optional.empty(),93 Optional.empty()));94 assertTrue(setCookie);95 assertEquals(1, devTools.send(getAllCookies()).size());96 assertEquals(0, devTools.send(getCookies(Optional.empty())).size());97 devTools.send(deleteCookies("name", Optional.empty(), Optional.of("localhost"),98 Optional.of("/devtools/test")));99 devTools.send(clearBrowserCookies());100 assertEquals(0, devTools.send(getAllCookies()).size());101 setCookie = devTools.send(setCookie(102 "name",103 "value",104 Optional.of("http://localhost/devtools/test"),105 Optional.of("localhost"),106 Optional.of("/devtools/test"),107 Optional.empty(),108 Optional.empty(),109 Optional.empty(),110 Optional.empty(),111 Optional.empty()));112 assertTrue(setCookie);113 assertEquals(1, devTools.send(getAllCookies()).size());114 }115 @Test116 public void sendRequestWithUrlFiltersAndExtraHeadersAndVerifyRequests() {117 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));118 devTools.send(setBlockedURLs(singletonList("*://*/*.css")));119 devTools.send(setExtraHTTPHeaders(new Headers(ImmutableMap.of("headerName", "headerValue"))));120 devTools.addListener(loadingFailed(), loadingFailed -> {121 if (loadingFailed.getType().equals(ResourceType.STYLESHEET)) {122 assertEquals(loadingFailed.getBlockedReason(), BlockedReason.INSPECTOR);123 }124 });125 devTools.addListener(requestWillBeSent(), requestWillBeSent -> assertEquals(requestWillBeSent.getRequest().getHeaders().get("headerName"),126 "headerValue"));127 devTools.addListener(dataReceived(),128 dataReceived -> Assert.assertNotNull(dataReceived.getRequestId()));129 driver.get(appServer.whereIs("js/skins/lightgray/content.min.css"));130 }131 @Test132 public void emulateNetworkConditionOffline() {133 devTools.send(enable(Optional.of(100000000), Optional.empty(), Optional.empty()));134 devTools.send(135 emulateNetworkConditions(true, 100, 1000, 2000, Optional.of(ConnectionType.CELLULAR3G)));136 devTools.addListener(loadingFailed(), loadingFailed -> assertEquals(loadingFailed.getErrorText(), "net::ERR_INTERNET_DISCONNECTED"));137 driver.get(appServer.whereIs("simpleTest.html"));138 }139 @Test140 public void verifyRequestReceivedFromCacheAndResponseBody() {141 final RequestId[] requestIdFromCache = new RequestId[1];142 devTools.send(enable(Optional.empty(), Optional.of(100000000), Optional.empty()));143 devTools.addListener(requestServedFromCache(), requestId -> {144 Assert.assertNotNull(requestId);145 requestIdFromCache[0] = requestId;146 });147 devTools.addListener(loadingFinished(),148 dataReceived -> Assert.assertNotNull(dataReceived.getRequestId()));149 driver.get(appServer.whereIsSecure("simpleTest.html"));150 driver.get(appServer.whereIsSecure("simpleTest.html"));151 Network.GetResponseBodyResponse responseBody = devTools.send(getResponseBody(requestIdFromCache[0]));152 Assert.assertNotNull(responseBody);153 }154 @Test155 public void verifySearchInResponseBody() {156 final RequestId[] requestIds = new RequestId[1];157 devTools.send(enable(Optional.empty(), Optional.of(100000000), Optional.empty()));158 devTools.addListener(responseReceived(), responseReceived -> {159 Assert.assertNotNull(responseReceived);160 Assert.assertNotNull(responseReceived.getResponse().getTiming());161 requestIds[0] = responseReceived.getRequestId();162 });163 driver.get(appServer.whereIs("simpleTest.html"));164 assertTrue(devTools.send(165 searchInResponseBody(requestIds[0], "/", Optional.empty(), Optional.empty())).size()166 > 0);167 }168 @Test169 public void verifyCacheDisabledAndClearCache() {170 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.of(100000000)));171 driver.get(appServer.whereIs("simpleTest.html"));172 devTools.send(setCacheDisabled(true));173 devTools.addListener(responseReceived(), responseReceived -> assertEquals(false, responseReceived.getResponse().getFromDiskCache()));174 driver.get(appServer.whereIs("simpleTest.html"));175 devTools.send(clearBrowserCache());176 }177 @Test178 @NotYetImplemented(CHROME)179 public void verifyCertificatesAndOverrideUserAgent() {180 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));181 devTools.send(setUserAgentOverride("userAgent", Optional.empty(), Optional.empty(), Optional.empty()));182 devTools.addListener(requestWillBeSent(),183 requestWillBeSent -> assertEquals("userAgent",184 requestWillBeSent185 .getRequest()186 .getHeaders()187 .get("User-Agent")));188 driver.get(appServer.whereIsSecure("simpleTest.html"));189 assertThat(devTools.send(getCertificate(appServer.whereIsSecure("simpleTest.html")))).isNotEmpty();190 }191 @Test192 public void verifyResponseReceivedEventAndNetworkDisable() {193 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));194 devTools.addListener(responseReceived(), Assert::assertNotNull);195 driver.get(appServer.whereIs("simpleTest.html"));196 devTools.send(disable());197 }198 @Test199 public void verifyWebSocketOperations() {200 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));201 devTools.addListener(webSocketCreated(), Assert::assertNotNull);202 devTools.addListener(webSocketFrameReceived(), Assert::assertNotNull);203 devTools.addListener(webSocketClosed(), Assert::assertNotNull);204 devTools.addListener(webSocketFrameError(), Assert::assertNotNull);205 devTools.addListener(webSocketFrameSent(), Assert::assertNotNull);206 driver.get(appServer.whereIs("simpleTest.html"));207 }208 @Test209 public void verifyRequestPostData() {210 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));211 final RequestId[] requestIds = new RequestId[1];212 devTools.addListener(requestWillBeSent(), requestWillBeSent -> {213 Assert.assertNotNull(requestWillBeSent);214 if (requestWillBeSent.getRequest().getMethod().equalsIgnoreCase(HttpMethod.POST.name())) {215 requestIds[0] = requestWillBeSent.getRequestId();216 }217 });218 driver.get(appServer.whereIs("postForm.html"));219 driver.findElement(By.xpath("/html/body/form/input")).click();220 Assert.assertNotNull(devTools.send(getRequestPostData(requestIds[0])));221 }222 @Test223 public void byPassServiceWorker() {224 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));225 devTools.send(setBypassServiceWorker(true));226 }227 @Test228 public void dataSizeLimitsForTest() {229 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));230 devTools.send(setDataSizeLimitsForTest(10000, 100000));231 }232 @Test233 public void verifyEventSourceMessage() {234 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));235 devTools.addListener(eventSourceMessageReceived(), Assert::assertNotNull);236 driver.get(appServer.whereIs("simpleTest.html"));237 }238 @Test239 public void verifySignedExchangeReceived() {240 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));241 devTools.addListener(signedExchangeReceived(), Assert::assertNotNull);242 driver.get(appServer.whereIsSecure("simpleTest.html"));243 }244 @Test245 public void verifyResourceChangedPriority() {246 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));247 devTools.addListener(resourceChangedPriority(), Assert::assertNotNull);248 driver.get(appServer.whereIsSecure("simpleTest.html"));249 }250 @Test251 public void interceptRequestAndContinue() {252 devTools.send(enable(Optional.empty(), Optional.empty(), Optional.empty()));253 devTools.addListener(requestIntercepted(),254 requestIntercepted -> devTools.send(255 continueInterceptedRequest(requestIntercepted.getInterceptionId(),256 Optional.empty(),257 Optional.empty(),258 Optional.empty(), Optional.empty(),259 Optional.empty(),260 Optional.empty(), Optional.empty())));261 RequestPattern requestPattern = new RequestPattern(262 Optional.of("*.css"),263 Optional.of(ResourceType.STYLESHEET),264 Optional.of(InterceptionStage.HEADERSRECEIVED));265 devTools.send(setRequestInterception(ImmutableList.of(requestPattern)));266 driver.get(appServer.whereIs("js/skins/lightgray/content.min.css"));267 }268}...
Source:Main.java
...64// * Enable Network Offline65// * @param devTools66// */67// private static void enableNetworkOffline(DevTools devTools) {68// devTools.send(Network.enable(Optional.of(100000000), Optional.empty(), Optional.empty()));69//70// devTools.send(emulateNetworkConditions(true, 100, 1000, 2000,71// Optional.of(ConnectionType.cellular3g)));72//73// devTools.addListener(loadingFailed(), loadingFailed -> assertEquals(loadingFailed.getErrorText(), "net::ERR_INTERNET_DISCONNECTED"));74// }75//76// /**77// * Enable Network Online78// * @param devTools79// */80// private static void enableNetworkOnline(DevTools devTools) {81// devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));82//83// devTools.send(emulateNetworkConditions(false, 100, 5000, 2000,84// Optional.of(ConnectionType.cellular4g)));85//86// }87//88//89// /**90// * Intercept Network91// * @param chromeDevTools92// */93// private static void interceptNetwork(DevTools chromeDevTools) {94// chromeDevTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));95//96// //set blocked URL patterns97// chromeDevTools.send(Network.setBlockedURLs(ImmutableList.of("*.css", "*.jpg")));98//99// //add event listener to verify that css and png are blocked100// chromeDevTools.addListener(loadingFailed(), loadingFailed -> {101//102// if (loadingFailed.getResourceType().equals(ResourceType.Stylesheet)) {103// assertEquals(loadingFailed.getBlockedReason(), BlockedReason.inspector);104// }105//106// else if (loadingFailed.getResourceType().equals(ResourceType.Image)) {107// assertEquals(loadingFailed.getBlockedReason(), BlockedReason.mixedContent);108// }109//110// });111// }112//113// /**114// * Inspect Detached Network115// * @param devTools116// */117// private static void inspectDetached(DevTools devTools) {118// devTools.addListener(detached(), Assert::assertNotNull);119// devTools.send(Inspector.enable());120// Set<TargetInfo> targetInfos = devTools.send(Target.getTargets());121// targetInfos.forEach(122// targetInfo -> {123// var sessionId = devTools.send(attachToTarget(targetInfo.getTargetId(), Optional.of(false)));124// devTools.send(125// Target.sendMessageToTarget(126// "{\"method\":\"Page.crash\"}",127// Optional.of(sessionId),128// Optional.of(targetInfo.getTargetId())));129// });130// devTools.send(Inspector.disable());131// }132//133//134// /**135// * Get Console Logs136// * @param chromeDevTools137// * @param message138// */139// private static void consoleLogs(DevTools chromeDevTools, String message) {140//141// chromeDevTools.send(Console.enable());142//143// //add listener to verify the console message144// chromeDevTools.addListener(Console.messageAdded(), consoleMessageFromDevTools ->145// assertEquals(true, consoleMessageFromDevTools.getText().equals(message)));146//147// }148//149// /**150// * Selenium Misc features151// * @param chromeDriver152// */153// private static void Selenium4MiscFetures(ChromeDriver chromeDriver){154//155// // New Tab156// var newTab = chromeDriver.switchTo().newWindow(WindowType.TAB);157// newTab.get("http://executeautomation.com/demosite/Login.html");158//159// //login160// newTab.findElement(By.name("UserName")).sendKeys("admin");161// newTab.findElement(By.name("Password")).sendKeys("admin");162// newTab.findElement(By.name("Login")).submit();163//164// var checkbox = chromeDriver.findElement(withTagName("input").below(By.name("Male")).toLeftOf(By.name("Hindi")));165// checkbox.click();166// System.out.println(checkbox.getAttribute("name"));167//168//169// var txtIntial = chromeDriver.findElement(withTagName("input")170// .below(By.id("TitleId"))171// .above(By.id("FirstName")));172//173// txtIntial.sendKeys("KK");174//175// //list of elements176// var lstElements = chromeDriver.findElements(withTagName("input")177// .below(By.xpath("//h2[text()=' User Form ']"))178// .above(By.name("Save")));179//180// var elements = lstElements181// .stream()182// .map(x -> x.getAttribute("input"));183//184// //should be 7185// System.out.println(elements.count());186// }187//}...
send
Using AI Code Generation
1import org.openqa.selenium.devtools.DevTools;2import org.openqa.selenium.devtools.v91.browser.Browser;3import org.openqa.selenium.devtools.v91.browser.model.BrowserContextID;4import org.openqa.selenium.devtools.v91.browser.model.BrowserContextInfo;5import org.openqa.selenium.devtools.v91.browser.model.BrowserInfo;6import org.openqa.selenium.devtools.v91.browser.model.BrowserVersion;7import org.openqa.selenium.devtools.v91.browser.model.GetVersionResponse;8import org.openqa.selenium.devtools.v91.browser.model.PermissionType;9import org.openqa.selenium.devtools.v91.browser.model.PermissionSetting;10import org.openqa.selenium.devtools.v91.browser.model.PermissionDescriptor;11import org.openqa.selenium.devtools.v91.browser.model.SetPermissionRequest;12import org.openqa.selenium.devtools.v91.browser.model.SetPermissionResponse;13import org.openqa.selenium.devtools.v91.browser.model.SetWindowBoundsRequest;14import org.openqa.selenium.devtools.v91.browser.model.SetWindowBoundsResponse;15import org.openqa.selenium.devtools.v91.browser.model.WindowBounds;16import org.openqa.selenium.devtools.v91.browser.model.WindowState;17import org.openqa.selenium.devtools.v91.browser.model.WindowID;18import org.openqa.selenium.devtools.v91.browser.model.WindowInfo;19import org.openqa.selenium.devtools.v91.browser.model.WindowPosition;20import org.openqa.selenium.devtools.v91.browser.model.WindowStateResponse;21import org.openqa.selenium.devtools.v91.browser.model.WindowType;22import org.openqa.selenium.devtools.v91.browser.model.WindowTypeResponse;23import org.openqa.selenium.devtools.v91.browser.model.WindowBoundsResponse;24import org.openqa.selenium.devtools.v91.browser.model.WindowPositionResponse;25import org.openqa.selenium.devtools.v91.browser.model.WindowSizeResponse;26import org.openqa.selenium.devtools.v91.browser.model.WindowStateRequest;27import org.openqa.selenium.devtools.v91.browser.model.WindowTypeRequest;28import org.openqa.selenium.devtools.v91.browser.model.WindowBoundsRequest;29import org.openqa.selenium.devtools.v91.browser.model.WindowPositionRequest;30import org.openqa.selenium.devtools.v91.browser.model.WindowSizeRequest;31import org.openqa.selenium.devtools.v91.browser.model.WindowIDResponse;32import org.openqa.selenium.devtools.v91.browser.model.WindowInfoResponse;33import org.openqa.selenium.devtools.v91.browser.model.WindowIDRequest;34import org.openqa.selenium.devtools.v91.browser.model.WindowInfoRequest;35import org.openqa.selenium.devtools.v91.browser.model.SetWindowBoundsResponse;36import org.openqa.selenium.devtools.v91.browser.model.SetWindowBoundsRequest;37import org.openqa.selenium
send
Using AI Code Generation
1import org.openqa.selenium.devtools.Connection;2import org.openqa.selenium.devtools.DevTools;3import org.openqa.selenium.devtools.v85.network.Network;4import org.openqa.selenium.devtools.v85.network.model.ConnectionType;5public class DevToolsSendMethod {6 public static void main(String[] args) {7 DevTools devTools = ((ChromeDriver) driver).getDevTools();8 devTools.createSession();9 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));10 devTools.send(Network.emulateNetworkConditions(11 Optional.of(ConnectionType.CELLULAR3G)));12 }13}14import org.openqa.selenium.devtools.Command;15import org.openqa.selenium.devtools.DevTools;16import org.openqa.selenium.devtools.v85.network.Network;17import org.openqa.selenium.devtools.v85.network.model.ConnectionType;18public class DevToolsSendMethod {19 public static void main(String[] args) {20 DevTools devTools = ((ChromeDriver) driver).getDevTools();21 devTools.createSession();22 devTools.send(new Command<>(Network.enable(), result -> {23 System.out.println("Network is enabled: " + result);24 }));25 devTools.send(new Command<>(Network.emulateNetworkConditions(26 Optional.of(ConnectionType.CELLULAR3G))));27 }28}29import org.openqa.selenium.devtools.Command;30import org.openqa.selenium.devtools.DevTools;31import org.openqa.selenium.devtools.v85.network.Network;32import org.openqa.selenium.devtools.v85.network.model.ConnectionType;33public class DevToolsSendMethod {34 public static void main(String[] args) {35 DevTools devTools = ((ChromeDriver) driver).getDevTools();36 devTools.createSession();37 devTools.send(new Command<>(Network.enable(), result -> {38 System.out.println("Network is enabled: " + result);39 }));40 devTools.send(new Command<>(Network.emulateNetworkConditions(41 Optional.of(ConnectionType.CELLULAR3G))));42 }43}44import org.openqa.selenium.devtools.Command;45import org.openqa.selenium.dev
send
Using AI Code Generation
1val connection = webDriver.getDevToolsConnection()2val send = connection.send(DevToolsMethod("Network", "enable"))3send.get()4val devTools = webDriver.getDevTools()5val send = devTools.send(DevToolsMethod("Network", "enable"))6send.get()7val devTools = webDriver.getDevTools()8val send = devTools.send(DevToolsMethod("Network", "enable"))9send.get()10val devTools = webDriver.getDevTools()11val send = devTools.send(DevToolsMethod("Network", "enable"))12send.get()13val devTools = webDriver.getDevTools()14val send = devTools.send(DevToolsMethod("Network", "enable"))15send.get()16val devTools = webDriver.getDevTools()17val send = devTools.send(DevToolsMethod("Network", "enable"))18send.get()19val devTools = webDriver.getDevTools()20val send = devTools.send(DevToolsMethod("Network", "enable"))21send.get()22val devTools = webDriver.getDevTools()23val send = devTools.send(DevToolsMethod("Network", "enable"))24send.get()25val devTools = webDriver.getDevTools()26val send = devTools.send(DevToolsMethod("Network", "enable"))27send.get()28val devTools = webDriver.getDevTools()29val send = devTools.send(DevToolsMethod("Network", "enable"))30send.get()31val devTools = webDriver.getDevTools()32val send = devTools.send(DevToolsMethod("Network", "enable"))33send.get()
send
Using AI Code Generation
1Connection connection = new ChromeDriver().getDevTools().createConnection();2Response response = connection.receive();3connection.close();4Connection connection = new ChromeDriver().getDevTools().createConnection();5Response response = connection.receive();6connection.close();7Connection connection = new ChromeDriver().getDevTools().createConnection();8Response response = connection.receive();9connection.close();10Connection connection = new ChromeDriver().getDevTools().createConnection();11Response response = connection.receive();12connection.close();13Connection connection = new ChromeDriver().getDevTools().createConnection();14Response response = connection.receive();15connection.close();
send
Using AI Code Generation
1import org.openqa.selenium.devtools.Command;2import org.openqa.selenium.devtools.DevTools;3import org.openqa.selenium.devtools.v91.browser.Browser;4import org.openqa.selenium.devtools.v91.browser.model.BrowserContextID;5import org.openqa.selenium.devtools.v91.browser.model.BrowserContextInfo;6import org.openqa.selenium.devtools.v91.browser.model.BrowserInfo;7import org.openqa.selenium.devtools.v91.browser.model.BrowserWindowBounds;8import org.openqa.selenium.devtools.v91.browser.model.Bounds;9import org.openqa.selenium.devtools.v91.browser.model.Version;10import org.openqa.selenium.devtools.v91.browser.model.WindowID;11import org.openqa.selenium.devtools.v91.browser.model.WindowInfo;12import org.openqa.selenium.devtools.v91.runtime.model.RemoteObject;13import org.openqa.selenium.devtools.v91.target.Target;14import org.openqa.selenium.devtools.v91.target.model.TargetID;15import org.openqa.selenium.devtools.v91.target.model.TargetInfo;16import org.openqa.selenium.devtools.v91.target.model.TargetType;17import org.openqa.selenium.devtools.v91.target.model.TargetsCreated;18import org.openqa.selenium.devtools.v91.target.model.TargetsDestroyed;19import org.openqa.selenium.devtools.v91.target.model.TargetsInfo;20import java.util.List;21import java.util.Map;22import java.util.concurrent.CompletableFuture;23public class BrowserDevTools {24 private DevTools devTools;25 private BrowserInfo browserInfo;26 private Version version;27 private List<BrowserContextInfo> browserContextInfos;28 private List<WindowInfo> windowInfos;29 private List<TargetInfo> targetInfos;30 public BrowserDevTools(DevTools devTools) {31 this.devTools = devTools;32 }33 public void printBrowserInfo() {34 CompletableFuture<BrowserInfo> browserInfoFuture = devTools.send(Browser.getBrowserInfo());35 browserInfo = browserInfoFuture.join();36 System.out.println("BrowserInfo: " + browserInfo.toString());37 }38 public void printVersion()
LambdaTest’s Selenium 4 tutorial is covering every aspects of Selenium 4 testing with examples and best practices. Here you will learn basics, such as how to upgrade from Selenium 3 to Selenium 4, to some advanced concepts, such as Relative locators and Selenium Grid 4 for Distributed testing. Also will learn new features of Selenium 4, such as capturing screenshots of specific elements, opening a new tab or window on the browser, and new protocol adoptions.
Upgrading From Selenium 3 To Selenium 4?: In this chapter, learn in detail how to update Selenium 3 to Selenium 4 for Java binding. Also, learn how to upgrade while using different build tools such as Maven or Gradle and get comprehensive guidance for upgrading Selenium.
What’s New In Selenium 4 & What’s Being Deprecated? : Get all information about new implementations in Selenium 4, such as W3S protocol adaption, Optimized Selenium Grid, and Enhanced Selenium IDE. Also, learn what is deprecated for Selenium 4, such as DesiredCapabilites and FindsBy methods, etc.
Selenium 4 With Python: Selenium supports all major languages, such as Python, C#, Ruby, and JavaScript. In this chapter, learn how to install Selenium 4 for Python and the features of Python in Selenium 4, such as Relative locators, Browser manipulation, and Chrom DevTool protocol.
Selenium 4 Is Now W3C Compliant: JSON Wireframe protocol is retiring from Selenium 4, and they are adopting W3C protocol to learn in detail about the advantages and impact of these changes.
How To Use Selenium 4 Relative Locator? : Selenium 4 came with new features such as Relative Locators that allow constructing locators with reference and easily located constructors nearby. Get to know its different use cases with examples.
Selenium Grid 4 Tutorial For Distributed Testing: Selenium Grid 4 allows you to perform tests over different browsers, OS, and device combinations. It also enables parallel execution browser testing, reads up on various features of Selenium Grid 4 and how to download it, and runs a test on Selenium Grid 4 with best practices.
Selenium Video Tutorials: Binge on video tutorials on Selenium by industry experts to get step-by-step direction from automating basic to complex test scenarios with Selenium.
LambdaTest also provides certification for Selenium testing to accelerate your career in Selenium automation testing.
Get 100 minutes of automation test minutes FREE!!