Skip to content

Commit bbdeaf3

Browse files
committed
Ability to delay the execution in headed mode
1 parent a094a03 commit bbdeaf3

14 files changed

Lines changed: 67 additions & 28 deletions

File tree

src/OrchardCoreContrib.Testing.UI/Browser.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace OrchardCoreContrib.Testing.UI;
1111
/// <param name="playwrightBrowserAccessor">The <see cref="IPlaywrightBrowserAccessor"/>.</param>
1212
/// <param name="type">The <see cref="BrowserType"/>.</param>
1313
/// <param name="headless">Whether to run browser in headless mode.</param>
14-
public class Browser(IPlaywrightBrowserAccessor playwrightBrowserAccessor, BrowserType type, bool headless) : IBrowser
14+
public class Browser(IPlaywrightBrowserAccessor playwrightBrowserAccessor, BrowserType type, bool headless, int delay) : IBrowser
1515
{
1616
/// <inheritdoc/>
1717
public PlaywrightBrowser InnerBrowser => playwrightBrowserAccessor.PlaywrightBrowser;
@@ -22,6 +22,9 @@ public class Browser(IPlaywrightBrowserAccessor playwrightBrowserAccessor, Brows
2222
/// <inheritdoc/>
2323
public BrowserType Type => type;
2424

25+
/// <inheritdoc/>
26+
public int Delay => delay;
27+
2528
/// <inheritdoc/>
2629
public string Version => InnerBrowser.Version;
2730

@@ -32,6 +35,6 @@ public async Task<IPage> OpenPageAsync(string url)
3235

3336
await page.GotoAsync(url);
3437

35-
return new Page(new PlaywrightPageAccessor(page));
38+
return new Page(this, new PlaywrightPageAccessor(page));
3639
}
3740
}

src/OrchardCoreContrib.Testing.UI/BrowserFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static class BrowserFactory
2020
/// <param name="headless">Whether the browser runs in headless mode or not.</param>
2121
/// <returns>An instance of <see cref="IBrowser"/>.</returns>
2222
/// <exception cref="NotSupportedException"></exception>
23-
public static async Task<IBrowser> CreateAsync(IPlaywright playwright, BrowserType browserType, bool headless)
23+
public static async Task<IBrowser> CreateAsync(IPlaywright playwright, BrowserType browserType, bool headless, int delay)
2424
{
2525
var browser = browserType switch
2626
{
@@ -30,6 +30,6 @@ public static async Task<IBrowser> CreateAsync(IPlaywright playwright, BrowserTy
3030
_ => throw new NotSupportedException()
3131
};
3232

33-
return new Browser(new PlaywrightBrowserAccessor(browser), browserType, headless);
33+
return new Browser(new PlaywrightBrowserAccessor(browser), browserType, headless, delay);
3434
}
3535
}

src/OrchardCoreContrib.Testing.UI/Element.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,17 @@ namespace OrchardCoreContrib.Testing.UI;
77
/// </summary>
88
/// <remarks>The <see cref="Element"/>.</remarks>
99
/// <param name="locator">The <see cref="ILocator"/>.</param>
10-
public class Element(ILocator locator) : IElement
10+
public class Element(IPage page, ILocator locator) : IElement
1111
{
12+
private readonly LocatorClickOptions _locatorClickOptions = page.Browser.Delay == 0
13+
? null
14+
: new() { Delay = page.Browser.Delay };
15+
private readonly LocatorPressSequentiallyOptions _locatorPressSequentiallyOptions = page.Browser.Delay == 0
16+
? null
17+
: new() { Delay = page.Browser.Delay };
18+
19+
IPage IElement.Page => page;
20+
1221
/// <inheritdoc/>
1322
public string InnerText => locator.InnerTextAsync().GetAwaiter().GetResult();
1423

@@ -22,8 +31,8 @@ public class Element(ILocator locator) : IElement
2231
public bool Visible => locator.IsVisibleAsync().GetAwaiter().GetResult();
2332

2433
/// <inheritdoc/>
25-
public async Task ClickAsync() => await locator.ClickAsync();
34+
public async Task ClickAsync() => await locator.ClickAsync(_locatorClickOptions);
2635

2736
/// <inheritdoc/>
28-
public async Task TypeAsync(string text) => await locator.FillAsync(text);
37+
public async Task TypeAsync(string text) => await locator.PressSequentiallyAsync(text, _locatorPressSequentiallyOptions);
2938
}

src/OrchardCoreContrib.Testing.UI/IBrowser.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public interface IBrowser
2020
/// </summary>
2121
public BrowserType Type { get; }
2222

23+
public int Delay { get; }
24+
2325
/// <summary>
2426
/// Gets the browser version.
2527
/// </summary>

src/OrchardCoreContrib.Testing.UI/IElement.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
/// </summary>
66
public interface IElement
77
{
8+
internal IPage Page { get; }
9+
810
/// <summary>
911
/// Gets the inner text of the element.
1012
/// </summary>

src/OrchardCoreContrib.Testing.UI/IPage.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public interface IPage
1010
/// </summary>
1111
public Microsoft.Playwright.IPage InnerPage { get; }
1212

13+
internal IBrowser Browser { get; }
14+
1315
/// <summary>
1416
/// Gets the page title.
1517
/// </summary>

src/OrchardCoreContrib.Testing.UI/Page.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,15 @@ namespace OrchardCoreContrib.Testing.UI;
99
/// Creates an instance of <see cref="Page"/>.
1010
/// </remarks>
1111
/// <param name="playwrightPageAccessor">The <see cref="IPlaywrightPageAccessor"/>.</param>
12-
public class Page(IPlaywrightPageAccessor playwrightPageAccessor) : IPage
12+
public class Page(IBrowser browser, IPlaywrightPageAccessor playwrightPageAccessor) : IPage
1313
{
14+
private readonly PageClickOptions _pageClickOptions = browser.Delay == 0
15+
? null
16+
: new() { Delay = browser.Delay };
17+
18+
/// <inheritdoc/>
19+
IBrowser IPage.Browser => browser;
20+
1421
/// <inheritdoc/>
1522
public Microsoft.Playwright.IPage InnerPage => playwrightPageAccessor.PlaywrightPage;
1623

@@ -28,11 +35,11 @@ public IElement FindElement(string selector)
2835
{
2936
var locator = InnerPage.Locator(selector);
3037

31-
return new Element(locator);
38+
return new Element(this, locator);
3239
}
3340

3441
/// <inheritdoc/>
35-
public async Task ClickAsync(string selector) => await FindElement(selector).ClickAsync();
42+
public async Task ClickAsync(string selector) => await InnerPage.ClickAsync(selector, _pageClickOptions);
3643

3744
/// <inheritdoc/>
3845
public async Task ScreenShotAsync(string path, bool fullPage = false)

src/OrchardCoreContrib.Testing.UI/UITest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace OrchardCoreContrib.Testing.UI;
99
/// </summary>
1010
/// <param name="browserType">The browser type that will be used during the test. Defaults to <see cref="BrowserType.Edge"/>.</param>
1111
/// <param name="headless">Whether the browser runs in headless mode or not. Defaults to <c>true</c>.</param>
12-
public class UITest(BrowserType browserType = BrowserType.Edge, bool headless = true) : IAsyncLifetime
12+
public class UITest(BrowserType browserType = BrowserType.Edge, bool headless = true, int delay = 0) : IAsyncLifetime
1313
{
1414
private IPlaywright _playwright;
1515

@@ -23,7 +23,7 @@ public async Task InitializeAsync()
2323
{
2424
_playwright = await Playwright.CreateAsync();
2525

26-
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless);
26+
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless, delay);
2727
}
2828

2929
/// <inheritdoc/>

src/OrchardCoreContrib.Testing.UI/UITestOfT.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace OrchardCoreContrib.Testing.UI;
1010
/// <param name="browserType">The browser type that will be used during the test. Defaults to <see cref="BrowserType.Edge"/>.</param>
1111
/// <param name="headless">Whether the browser runs in headless mode or not. Defaults to <c>true</c>.</param>
1212
/// <typeparam name="TStartup">The startup class type that will be used as entry point.</typeparam>
13-
public class UITest<TStartup>(BrowserType browserType = BrowserType.Edge, bool headless = true) :
13+
public class UITest<TStartup>(BrowserType browserType = BrowserType.Edge, bool headless = true, int delay = 0) :
1414
UITestBase<TStartup>(new WebApplicationFactoryFixture<TStartup>()),
1515
IAsyncLifetime where TStartup : class
1616
{
@@ -26,7 +26,7 @@ public async Task InitializeAsync()
2626
{
2727
_playwright = await Playwright.CreateAsync();
2828

29-
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless);
29+
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless, delay);
3030
}
3131

3232
/// <inheritdoc/>

test/OrchardCoreContrib.Testing.UI.Tests/BrowserFactoryTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public async Task CreateBrowser(BrowserType browserType, string playwrightBrowse
1717
var playwright = await Playwright.CreateAsync();
1818

1919
// Act
20-
var browser = await BrowserFactory.CreateAsync(playwright, browserType, headless);
20+
var browser = await BrowserFactory.CreateAsync(playwright, browserType, headless, delay: 0);
2121

2222
// Assert
2323
Assert.NotNull(browser);
@@ -35,7 +35,7 @@ public async Task CreateBrowser_ThrowsException_WhenBrowserTypeInvalid()
3535
// Act & Assert
3636
await Assert.ThrowsAsync<NotSupportedException>(async () =>
3737
{
38-
await BrowserFactory.CreateAsync(playwright, BrowserType.NotSet, headless: true);
38+
await BrowserFactory.CreateAsync(playwright, BrowserType.NotSet, headless: true, delay: 0);
3939
});
4040
}
4141
}

0 commit comments

Comments
 (0)