How to use RouteFulfillOptions class of Microsoft.Playwright package

Best Playwright-dotnet code snippet using Microsoft.Playwright.RouteFulfillOptions

IPage.cs

Source:IPage.cs Github

copy

Full Screen

...1320 /// <code>1321 /// await page.RouteAsync("/api/**", async r =&gt;<br/>1322 /// {<br/>1323 /// if (r.Request.PostData.Contains("my-string"))<br/>1324 /// await r.FulfillAsync(new RouteFulfillOptions { Body = "mocked-data" });<br/>1325 /// else<br/>1326 /// await r.ContinueAsync();<br/>1327 /// });1328 /// </code>1329 /// <para>1330 /// Page routes take precedence over browser context routes (set up with <see cref="IBrowserContext.RouteAsync"/>)1331 /// when request matches both handlers.1332 /// </para>1333 /// <para>To remove a route with its handler you can use <see cref="IPage.UnrouteAsync"/>.</para>1334 /// </summary>1335 /// <remarks>1336 /// <para>The handler will only be called for the first url if the response is a redirect.</para>1337 /// <para>1338 /// <see cref="IPage.RouteAsync"/> will not intercept requests intercepted by Service1339 /// Worker. See <a href="https://github.com/microsoft/playwright/issues/1090">this</a>1340 /// issue. We recommend disabling Service Workers when using request interception. Via1341 /// <c>await context.addInitScript(() =&gt; delete window.navigator.serviceWorker);</c>1342 /// </para>1343 /// <para>Enabling routing disables http cache.</para>1344 /// </remarks>1345 /// <param name="url">1346 /// A glob pattern, regex pattern or predicate receiving <see cref="URL"/> to match1347 /// while routing. When a <paramref name="baseURL"/> via the context options was provided1348 /// and the passed URL is a path, it gets merged via the <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL"><c>new1349 /// URL()</c></a> constructor.1350 /// </param>1351 /// <param name="handler">handler function to route the request.</param>1352 /// <param name="options">Call options</param>1353 Task RouteAsync(string url, Action<IRoute> handler, PageRouteOptions? options = default);1354 /// <summary>1355 /// <para>Routing provides the capability to modify network requests that are made by a page.</para>1356 /// <para>1357 /// Once routing is enabled, every request matching the url pattern will stall unless1358 /// it's continued, fulfilled or aborted.1359 /// </para>1360 /// <para>An example of a naive handler that aborts all image requests:</para>1361 /// <code>1362 /// var page = await browser.NewPageAsync();<br/>1363 /// await page.RouteAsync("**/*.{png,jpg,jpeg}", async r =&gt; await r.AbortAsync());<br/>1364 /// await page.GotoAsync("https://www.microsoft.com");1365 /// </code>1366 /// <para>or the same snippet using a regex pattern instead:</para>1367 /// <code>1368 /// var page = await browser.NewPageAsync();<br/>1369 /// await page.RouteAsync(new Regex("(\\.png$)|(\\.jpg$)"), async r =&gt; await r.AbortAsync());<br/>1370 /// await page.GotoAsync("https://www.microsoft.com");1371 /// </code>1372 /// <para>1373 /// It is possible to examine the request to decide the route action. For example, mocking1374 /// all requests that contain some post data, and leaving all other requests as is:1375 /// </para>1376 /// <code>1377 /// await page.RouteAsync("/api/**", async r =&gt;<br/>1378 /// {<br/>1379 /// if (r.Request.PostData.Contains("my-string"))<br/>1380 /// await r.FulfillAsync(new RouteFulfillOptions { Body = "mocked-data" });<br/>1381 /// else<br/>1382 /// await r.ContinueAsync();<br/>1383 /// });1384 /// </code>1385 /// <para>1386 /// Page routes take precedence over browser context routes (set up with <see cref="IBrowserContext.RouteAsync"/>)1387 /// when request matches both handlers.1388 /// </para>1389 /// <para>To remove a route with its handler you can use <see cref="IPage.UnrouteAsync"/>.</para>1390 /// </summary>1391 /// <remarks>1392 /// <para>The handler will only be called for the first url if the response is a redirect.</para>1393 /// <para>1394 /// <see cref="IPage.RouteAsync"/> will not intercept requests intercepted by Service1395 /// Worker. See <a href="https://github.com/microsoft/playwright/issues/1090">this</a>1396 /// issue. We recommend disabling Service Workers when using request interception. Via1397 /// <c>await context.addInitScript(() =&gt; delete window.navigator.serviceWorker);</c>1398 /// </para>1399 /// <para>Enabling routing disables http cache.</para>1400 /// </remarks>1401 /// <param name="url">1402 /// A glob pattern, regex pattern or predicate receiving <see cref="URL"/> to match1403 /// while routing. When a <paramref name="baseURL"/> via the context options was provided1404 /// and the passed URL is a path, it gets merged via the <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL"><c>new1405 /// URL()</c></a> constructor.1406 /// </param>1407 /// <param name="handler">handler function to route the request.</param>1408 /// <param name="options">Call options</param>1409 Task RouteAsync(Regex url, Action<IRoute> handler, PageRouteOptions? options = default);1410 /// <summary>1411 /// <para>Routing provides the capability to modify network requests that are made by a page.</para>1412 /// <para>1413 /// Once routing is enabled, every request matching the url pattern will stall unless1414 /// it's continued, fulfilled or aborted.1415 /// </para>1416 /// <para>An example of a naive handler that aborts all image requests:</para>1417 /// <code>1418 /// var page = await browser.NewPageAsync();<br/>1419 /// await page.RouteAsync("**/*.{png,jpg,jpeg}", async r =&gt; await r.AbortAsync());<br/>1420 /// await page.GotoAsync("https://www.microsoft.com");1421 /// </code>1422 /// <para>or the same snippet using a regex pattern instead:</para>1423 /// <code>1424 /// var page = await browser.NewPageAsync();<br/>1425 /// await page.RouteAsync(new Regex("(\\.png$)|(\\.jpg$)"), async r =&gt; await r.AbortAsync());<br/>1426 /// await page.GotoAsync("https://www.microsoft.com");1427 /// </code>1428 /// <para>1429 /// It is possible to examine the request to decide the route action. For example, mocking1430 /// all requests that contain some post data, and leaving all other requests as is:1431 /// </para>1432 /// <code>1433 /// await page.RouteAsync("/api/**", async r =&gt;<br/>1434 /// {<br/>1435 /// if (r.Request.PostData.Contains("my-string"))<br/>1436 /// await r.FulfillAsync(new RouteFulfillOptions { Body = "mocked-data" });<br/>1437 /// else<br/>1438 /// await r.ContinueAsync();<br/>1439 /// });1440 /// </code>1441 /// <para>1442 /// Page routes take precedence over browser context routes (set up with <see cref="IBrowserContext.RouteAsync"/>)1443 /// when request matches both handlers.1444 /// </para>1445 /// <para>To remove a route with its handler you can use <see cref="IPage.UnrouteAsync"/>.</para>1446 /// </summary>1447 /// <remarks>1448 /// <para>The handler will only be called for the first url if the response is a redirect.</para>1449 /// <para>1450 /// <see cref="IPage.RouteAsync"/> will not intercept requests intercepted by Service...

Full Screen

Full Screen

Route.cs

Source:Route.cs Github

copy

Full Screen

...50 /// </summary>51 public IRequest Request => _initializer.Request;52 ChannelBase IChannelOwner.Channel => _channel;53 IChannel<Route> IChannelOwner<Route>.Channel => _channel;54 public Task FulfillAsync(RouteFulfillOptions options = default)55 {56 options ??= new RouteFulfillOptions();57 var normalized = NormalizeFulfillParameters(58 options.Status,59 options.Headers,60 options.ContentType,61 options.Body,62 options.BodyBytes,63 options.Path);64 return RaceWithPageCloseAsync(_channel.FulfillAsync(normalized));65 }66 public Task AbortAsync(string errorCode = RequestAbortErrorCode.Failed) => RaceWithPageCloseAsync(_channel.AbortAsync(errorCode));67 public Task ContinueAsync(RouteContinueOptions options = default)68 {69 options ??= new RouteContinueOptions();70 return RaceWithPageCloseAsync(_channel.ContinueAsync(url: options.Url, method: options.Method, postData: options.PostData, headers: options.Headers));...

Full Screen

Full Screen

IRoute.cs

Source:IRoute.cs Github

copy

Full Screen

...100 /// contentType: "text/plain",<br/>101 /// body: "Not Found!"));102 /// </code>103 /// <para>An example of serving static file:</para>104 /// <code>await page.RouteAsync("**/xhr_endpoint", route =&gt; route.FulfillAsync(new RouteFulfillOptions { Path = "mock_data.json" }));</code>105 /// </summary>106 /// <param name="options">Call options</param>107 Task FulfillAsync(RouteFulfillOptions? options = default);108 /// <summary><para>A request to be routed.</para></summary>109 IRequest Request { get; }110 }111}112#nullable disable...

Full Screen

Full Screen

RouteSynchronous.cs

Source:RouteSynchronous.cs Github

copy

Full Screen

...86 /// contentType: "text/plain", <br/>87 /// body: "Not Found!"));88 /// </code>89 /// <para>An example of serving static file:</para>90 /// <code>await page.RouteAsync("**/xhr_endpoint", route =&gt; route.FulfillAsync(new RouteFulfillOptions { Path = "mock_data.json" }));</code>91 /// </summary>92 /// <param name="options">Call options</param>93 public static void FulfillAsync(this IRoute route, RouteFulfillOptions? options = default)94 {95 route.FulfillAsync(options).GetAwaiter().GetResult();96 }97}...

Full Screen

Full Screen

LocatorFrameTests.cs

Source:LocatorFrameTests.cs Github

copy

Full Screen

...30 public async Task RouteIFrame(IPage page)31 {32 await page.RouteAsync("**/empty.html", async route =>33 {34 await route.FulfillAsync(new RouteFulfillOptions35 {36 Body = "<iframe src=\"/iframe.html\"></iframe>",37 ContentType = "text/html"38 });39 });40 await page.RouteAsync("**/iframe.html", async route =>41 {42 await route.FulfillAsync(new RouteFulfillOptions43 {44 Body = @"45 <html>46 <div>47 <button>Hello iframe</button>48 <iframe src=""iframe-2.html""></iframe>49 </div>50 <span>1</span>51 <span>2</span>52 </html>",53 ContentType = "text/html"54 });55 });56 await page.RouteAsync("**/iframe-2.html", async route =>57 {58 await route.FulfillAsync(new RouteFulfillOptions59 {60 Body = "<html><button>Hello nested iframe</button></html>",61 ContentType = "text/html"62 });63 });64 }65 [PlaywrightTest("locator-frame.spec.ts", "should work for iframe")]66 public async Task ShouldWorkForIFrame()67 {68 await RouteIFrame(Page);69 await Page.GotoAsync(Server.EmptyPage);70 var button = Page.FrameLocator("iframe").Locator("button");71 await button.WaitForAsync();72 Assert.AreEqual(await button.InnerTextAsync(), "Hello iframe");...

Full Screen

Full Screen

RouteFulfillOptions.cs

Source:RouteFulfillOptions.cs Github

copy

Full Screen

...35using System.Threading.Tasks;36#nullable enable37namespace Microsoft.Playwright38{39 public class RouteFulfillOptions40 {41 public RouteFulfillOptions() { }42 public RouteFulfillOptions(RouteFulfillOptions clone)43 {44 if (clone == null)45 {46 return;47 }48 Body = clone.Body;49 BodyBytes = clone.BodyBytes;50 ContentType = clone.ContentType;51 Headers = clone.Headers;52 Path = clone.Path;53 Status = clone.Status;54 }55 /// <summary><para>Optional response body as text.</para></summary>56 [JsonPropertyName("body")]...

Full Screen

Full Screen

Program.cs

Source:Program.cs Github

copy

Full Screen

...21 string usersUrl = "https://jsonplaceholder.typicode.com/**";22 await page.RouteAsync(usersUrl,async route => {23 24 if(route.Request.Method.ToUpperInvariant() == "GET"){25 await route.FulfillAsync(new RouteFulfillOptions { 26 Status = 20027 , ContentType = "application/json"28 , Headers = new List<KeyValuePair<string, string>>{ 29 new KeyValuePair<string, string>("Access-Control-Allow-Credentials", "true" ), 30 new KeyValuePair<string, string>("Access-Control-Allow-Origin", "*" ), 31 }32 , Body = context.Data });33 }34 else if(route.Request.Method.ToUpperInvariant() == "PUT"){35 36 context.UpdateUser(route.Request.PostData);37 38 await route.FulfillAsync(new RouteFulfillOptions { 39 Status = 20040 , ContentType = "application/json"41 , Headers = new List<KeyValuePair<string, string>>{ 42 new KeyValuePair<string, string>("Access-Control-Allow-Credentials", "true" ), 43 new KeyValuePair<string, string>("Access-Control-Allow-Origin", "*" ), 44 }45 , Body = route.Request.PostData });46 }47 else{48 await route.ContinueAsync();49 }50 });51 await page.GotoAsync(url);52 ...

Full Screen

Full Screen

UnitTest1.cs

Source:UnitTest1.cs Github

copy

Full Screen

...61 stock = 6553562 }};63 var list = new List<object>(){mockResponseObject};64 await _Page.RouteAsync("https://danube-webshop.herokuapp.com/api/books", async route =>{65 await route.FulfillAsync(new RouteFulfillOptions {66 ContentType = "application/json",67 Body = JsonConvert.SerializeObject(mockResponseObject)68 });69 });70 await _Page.GotoAsync("https://danube-webshop.herokuapp.com/");71 }72}...

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5 {6 static async Task Main(string[] args)7 {8 using var playwright = await Playwright.CreateAsync();9 await using var browser = await playwright.Chromium.LaunchAsync(new LaunchOptions10 {11 });12 var context = await browser.NewContextAsync();13 var page = await context.NewPageAsync();14 {15 };16 await page.RouteAsync("**/*", route => route.FulfillAsync(routeFulfillOptions));17 await page.ScreenshotAsync("screenshot.png");18 }19 }20}

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5 {6 static async Task Main(string[] args)7 {8 using var playwright = await Playwright.CreateAsync();9 await using var browser = await playwright.Chromium.LaunchAsync();10 var page = await browser.NewPageAsync();11 var route = await page.RouteAsync("**/*", route => route.FulfillAsync(new RouteFulfillOptions()12 {13 }));14 await route.DisposeAsync();15 await browser.CloseAsync();16 }17 }18}19I am a Microsoft Certified Trainer (MCT) and a Microsoft Certified Azure Developer (MCAD). I am a passionate developer with 15+ years of experience in developing applications using Microsoft technologies. I am also an active blogger and speaker. I am a Microsoft Azure MVP since 2017. I am a founder of Dotnetjalps (www.dotnetjalps.com). View all posts by Sanjay Kansagara

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5 {6 static async Task Main(string[] args)7 {8 using var playwright = await Playwright.CreateAsync();9 await using var browser = await playwright.Chromium.LaunchAsync(new LaunchOptions { Headless = false });10 var context = await browser.NewContextAsync();11 var page = await context.NewPageAsync();12 await page.RouteAsync("**/*", route =>13 {14 var options = new RouteFulfillOptions { Status = 200, Body = "Hello World" };15 route.FulfillAsync(options);16 return Task.CompletedTask;17 });18 await page.ClickAsync("text=Images");19 await page.WaitForTimeoutAsync(5000);20 }21 }22}

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using Microsoft.Playwright;2using System;3using System.Threading.Tasks;4{5 {6 static async Task Main(string[] args)7 {8 using var playwright = await Playwright.CreateAsync();9 await using var browser = await playwright.Chromium.LaunchAsync();10 var page = await browser.NewPageAsync();11 var routeTask = page.WaitForRequestAsync("**/*", new RouteFulfillOptions12 {13 });14 var route = await routeTask;15 Console.WriteLine(await route.Response.TextAsync());16 }17 }18}19using Microsoft.Playwright;20using System;21using System.Threading.Tasks;22{23 {24 static async Task Main(string[] args)25 {26 using var playwright = await Playwright.CreateAsync();27 await using var browser = await playwright.Chromium.LaunchAsync();28 var page = await browser.NewPageAsync();29 var routeTask = page.WaitForRequestAsync("**/*", new RouteFulfillOptions30 {31 });32 var route = await routeTask;33 Console.WriteLine(await route.Response.TextAsync());34 }35 }36}37using Microsoft.Playwright;38using System;39using System.Threading.Tasks;40{41 {42 static async Task Main(string[] args)43 {44 using var playwright = await Playwright.CreateAsync();45 await using var browser = await playwright.Chromium.LaunchAsync();46 var page = await browser.NewPageAsync();47 var routeTask = page.WaitForRequestAsync("**/*", new RouteFulfillOptions48 {49 });

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using Microsoft.Playwright;2{3 {4 static async Task Main(string[] args)5 {6 using var playwright = await Playwright.CreateAsync();using Microsoft.Playwright;7 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions8 {9 });10 var page = await browser.NewPageAsync();11 await page.RouteAsync("**/*", route =>12 {13 {14 {15 ["Content-Type"] = "text/html; charset=utf-8",16 },17 };18 return route.FulfillAsync(options);19 });20 await Task.Delay(3000);21 }22 }23}24using Microsoft.Playwright;25{26 {27 static async Task Main(string[] args)28 {29 using var playwright = await Playwright.CreateAsync();30 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions31 {32 });33 var page = await browser.NewPageAsync();34 await page.RouteAsync("**/*", route =>35 {36 {37 {38 ["Content-Type"] = "text/html; charset=utf-8",39 },40 };41 return route.FulfillAsync(options);42 });43 await Task.Delay(3000);44 }45 }46}47using Microsoft.Playwright;48{49 {50 static async Task Main(string[] args)51 {52 using var playwright = await Playwright.CreateAsync();53 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions54 {

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using System;2using System.Threading.Tasks;3{4 {5 static async Task Main(string[] args)6 {7 using var playwright = await Playwright.CreateAsync();8 await using var browser = await playwright.Chromium.LaunchAsync();9 var page = await browser.NewPageAsync();10 var routeTask = page.WaitForRequestAsync("**/*", new RouteFulfillOptions11 {12 });13 var route = await routeTask;14 Console.WriteLine(await route.Response.TextAsync());15 }16 }17}18using Microsoft.Playwright;19using System;20using System.Threading.Tasks;21{22 {23 static async Task Main(string[] args)24 {25 using var playwright = await Playwright.CreateAsync();26 await using var browser = await playwright.Chromium.LaunchAsync();27 var page = await browser.NewPageAsync();28 var routeTask = page.WaitForRequestAsync("**/*", new RouteFulfillOptions29 {30 });31 var route = await routeTask;32 Console.WriteLine(await route.Response.TextAsync());33 }34 }35}36using Microsoft.Playwright;37using System;38using System.Threading.Tasks;39{40 {41 static async Task Main(string[] args)42 {

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1{2 {3 static async Task Main(string[] args)4 {5 using var playwright = await Playwright.CreateAsync();6 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions7 {8 });9 var context = await browser.NewContextAsync(new BrowserNewContextOptions10 {11 {12 }13 });14 var page = await context.NewPageAsync();15 await page.ScreenshotAsync("screenshot.png");16 await context.CloseAsync();17 }18 }19} {20 });

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1using System;2using System.Net;3using System.Threading.Tasks;4using Microsoft.Playwright;5{6 {7 static async Task Main(string[] args)8 {9 using var playwright = await Playwright.CreateAsync();10 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions11 {12 });13 var page = await browser.NewPageAsync();14 await page.RouteAsync("**/2", async route =>15 {16 await route.FulfillAsync(new RouteFulfillOptions17 {18 });19 });20 await page.WaitForTimeoutAsync(5000);21 }22 }23}

Full Screen

Full Screen

RouteFulfillOptions

Using AI Code Generation

copy

Full Screen

1{2 {3 static async Task Main(string[] args)4 {5 using var playwright = await Playwright.CreateAsync();6 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions7 {8 });9 var context = await browser.NewContextAsync(new BrowserNewContextOptions10 {11 {12 }13 });14 var page = await context.NewPageAsync();15 await page.ScreenshotAsync("screenshot.png");16 await context.CloseAsync();17 }18 }19}

Full Screen

Full Screen

Playwright tutorial

LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright-dotnet automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used methods in RouteFulfillOptions

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful