Skip to content

Commit 0f1d717

Browse files
committed
Add UITestOptions
- Make properties for IBrowser, IPage, IElement getter & setter
1 parent a094a03 commit 0f1d717

15 files changed

Lines changed: 130 additions & 75 deletions

File tree

src/OrchardCoreContrib.Testing.UI/Browser.cs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,30 @@ 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) : IBrowser
1515
{
1616
/// <inheritdoc/>
1717
public PlaywrightBrowser InnerBrowser => playwrightBrowserAccessor.PlaywrightBrowser;
1818

1919
/// <inheritdoc/>
20-
public bool Headless => headless;
20+
public BrowserType Type { get; set; }
2121

2222
/// <inheritdoc/>
23-
public BrowserType Type => type;
24-
25-
/// <inheritdoc/>
26-
public string Version => InnerBrowser.Version;
23+
public string Version { get; set; } = playwrightBrowserAccessor.PlaywrightBrowser.Version;
2724

2825
/// <inheritdoc/>
2926
public async Task<IPage> OpenPageAsync(string url)
3027
{
31-
var page = await InnerBrowser.NewPageAsync();
28+
var playwrightPage = await InnerBrowser.NewPageAsync();
29+
30+
await playwrightPage.GotoAsync(url);
3231

33-
await page.GotoAsync(url);
32+
var page = new Page(new PlaywrightPageAccessor(playwrightPage))
33+
{
34+
Title = await playwrightPage.TitleAsync(),
35+
Content = await playwrightPage.ContentAsync()
36+
};
3437

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

src/OrchardCoreContrib.Testing.UI/BrowserFactory.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,29 @@ public static class BrowserFactory
1616
/// Creates a new instance of <see cref="IBrowser"/> with a given browser type.
1717
/// </summary>
1818
/// <param name="playwright">The <see cref="IPlaywright"/>.</param>
19-
/// <param name="browserType">The browser type in which <see cref="IBrowser"/> will be created.</param>
20-
/// <param name="headless">Whether the browser runs in headless mode or not.</param>
19+
/// <param name="testOptions">The <see cref="UITestOptions"/>.</param>
2120
/// <returns>An instance of <see cref="IBrowser"/>.</returns>
2221
/// <exception cref="NotSupportedException"></exception>
23-
public static async Task<IBrowser> CreateAsync(IPlaywright playwright, BrowserType browserType, bool headless)
22+
public static async Task<IBrowser> CreateAsync(IPlaywright playwright, UITestOptions testOptions)
2423
{
25-
var browser = browserType switch
24+
var browser = testOptions.BrowserType switch
2625
{
27-
BrowserType.Edge => _edgeBrowser ?? await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Channel = "msedge", Headless = headless }),
28-
BrowserType.Chrome => _chromeBrowser ?? await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = headless }),
29-
BrowserType.Firefox => _fireFoxBrowser ?? await playwright.Firefox.LaunchAsync(new BrowserTypeLaunchOptions { Headless = headless }),
26+
BrowserType.Edge => _edgeBrowser ?? await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
27+
{
28+
Channel = "msedge",
29+
Headless = testOptions.Headless
30+
}),
31+
BrowserType.Chrome => _chromeBrowser ?? await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
32+
{
33+
Headless = testOptions.Headless
34+
}),
35+
BrowserType.Firefox => _fireFoxBrowser ?? await playwright.Firefox.LaunchAsync(new BrowserTypeLaunchOptions
36+
{
37+
Headless = testOptions.Headless
38+
}),
3039
_ => throw new NotSupportedException()
3140
};
3241

33-
return new Browser(new PlaywrightBrowserAccessor(browser), browserType, headless);
42+
return new Browser(new PlaywrightBrowserAccessor(browser)) { Type = testOptions.BrowserType };
3443
}
3544
}

src/OrchardCoreContrib.Testing.UI/Element.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,26 @@ namespace OrchardCoreContrib.Testing.UI;
1010
public class Element(ILocator locator) : IElement
1111
{
1212
/// <inheritdoc/>
13-
public string InnerText => locator.InnerTextAsync().GetAwaiter().GetResult();
13+
public string InnerText { get; set; }
1414

1515
/// <inheritdoc/>
16-
public string InnerHtml => locator.InnerHTMLAsync().GetAwaiter().GetResult();
16+
public string InnerHtml { get; set; }
1717

1818
/// <inheritdoc/>
19-
public bool Enabled => locator.IsEnabledAsync().GetAwaiter().GetResult();
19+
public bool Enabled { get; set; }
2020

2121
/// <inheritdoc/>
22-
public bool Visible => locator.IsVisibleAsync().GetAwaiter().GetResult();
22+
public bool Visible { get; set; }
2323

2424
/// <inheritdoc/>
2525
public async Task ClickAsync() => await locator.ClickAsync();
2626

2727
/// <inheritdoc/>
28-
public async Task TypeAsync(string text) => await locator.FillAsync(text);
28+
public async Task TypeAsync(string text)
29+
{
30+
await locator.FillAsync(text);
31+
32+
InnerText = await locator.InnerTextAsync();
33+
InnerHtml = await locator.InnerHTMLAsync();
34+
}
2935
}

src/OrchardCoreContrib.Testing.UI/IBrowser.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,14 @@ public interface IBrowser
1111
public Microsoft.Playwright.IBrowser InnerBrowser { get; }
1212

1313
/// <summary>
14-
/// Gets whether the browser runs on headless mode or not.
14+
/// Gets or sets the browser type.
1515
/// </summary>
16-
public bool Headless { get; }
16+
public BrowserType Type { get; set; }
1717

1818
/// <summary>
19-
/// Gets the browser type.
19+
/// Gets or sets the browser version.
2020
/// </summary>
21-
public BrowserType Type { get; }
22-
23-
/// <summary>
24-
/// Gets the browser version.
25-
/// </summary>
26-
public string Version { get; }
21+
public string Version { get; set; }
2722

2823
/// <summary>
2924
/// Opens a page with a given URL

src/OrchardCoreContrib.Testing.UI/IElement.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public interface IElement
88
/// <summary>
99
/// Gets the inner text of the element.
1010
/// </summary>
11-
public string InnerText { get; }
11+
public string InnerText { get; set; }
1212

1313
/// <summary>
1414
/// Gets the inner HTML of the element.
@@ -18,12 +18,12 @@ public interface IElement
1818
/// <summary>
1919
/// Gets whether the element is enabled.
2020
/// </summary>
21-
public bool Enabled { get; }
21+
public bool Enabled { get; set; }
2222

2323
/// <summary>
2424
/// Gets whether the element is visible.
2525
/// </summary>
26-
public bool Visible { get; }
26+
public bool Visible { get; set; }
2727

2828
/// <summary>
2929
/// Writes a given text into an element.

src/OrchardCoreContrib.Testing.UI/IPage.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public interface IPage
1111
public Microsoft.Playwright.IPage InnerPage { get; }
1212

1313
/// <summary>
14-
/// Gets the page title.
14+
/// Gets or sets the page title.
1515
/// </summary>
16-
public string Title { get; }
16+
public string Title { get; set; }
1717

1818
/// <summary>
19-
/// Gets the page content in HTML format.
19+
/// Gets or sets the page content in HTML format.
2020
/// </summary>
21-
public string Content { get; }
21+
public string Content { get; set; }
2222

2323
/// <summary>
2424
/// Navigates to a given URL.

src/OrchardCoreContrib.Testing.UI/Page.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,33 @@ public class Page(IPlaywrightPageAccessor playwrightPageAccessor) : IPage
1515
public Microsoft.Playwright.IPage InnerPage => playwrightPageAccessor.PlaywrightPage;
1616

1717
/// <inheritdoc/>
18-
public string Title => InnerPage.TitleAsync().GetAwaiter().GetResult();
18+
public string Title { get; set; }
1919

2020
/// <inheritdoc/>
21-
public string Content => InnerPage.ContentAsync().GetAwaiter().GetResult();
21+
public string Content { get; set; }
2222

2323
/// <inheritdoc/>
24-
public async Task GoToAsync(string url) => await InnerPage.GotoAsync(url);
24+
public async Task GoToAsync(string url)
25+
{
26+
await InnerPage.GotoAsync(url);
27+
28+
Title = await InnerPage.TitleAsync();
29+
Content = await InnerPage.ContentAsync();
30+
}
2531

2632
/// <inheritdoc/>
2733
public IElement FindElement(string selector)
2834
{
2935
var locator = InnerPage.Locator(selector);
30-
31-
return new Element(locator);
36+
var element = new Element(locator)
37+
{
38+
InnerText = locator.InnerTextAsync().GetAwaiter().GetResult(),
39+
InnerHtml = locator.InnerHTMLAsync().GetAwaiter().GetResult(),
40+
Enabled = locator.IsEnabledAsync().GetAwaiter().GetResult(),
41+
Visible = locator.IsVisibleAsync().GetAwaiter().GetResult()
42+
};
43+
44+
return element;
3245
}
3346

3447
/// <inheritdoc/>

src/OrchardCoreContrib.Testing.UI/UITest.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.Playwright;
2-
using OrchardCoreContrib.Testing.UI.Infrastructure;
32
using Xunit;
43

54
namespace OrchardCoreContrib.Testing.UI;
@@ -18,12 +17,20 @@ public class UITest(BrowserType browserType = BrowserType.Edge, bool headless =
1817
/// </summary>
1918
public IBrowser Browser { get; private set; }
2019

20+
public UITestOptions Options { get; private set; }
21+
2122
/// <inheritdoc/>
2223
public async Task InitializeAsync()
2324
{
25+
Options = new UITestOptions
26+
{
27+
BrowserType = browserType,
28+
Headless = headless
29+
};
30+
2431
_playwright = await Playwright.CreateAsync();
2532

26-
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless);
33+
Browser = await BrowserFactory.CreateAsync(_playwright, Options);
2734
}
2835

2936
/// <inheritdoc/>

src/OrchardCoreContrib.Testing.UI/UITestBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ public abstract class UITestBase<TStartup>(WebApplicationFactoryFixture<TStartup
1313
/// Gets the base URL used for the tested website.
1414
/// </summary>
1515
public string BaseUrl => fixture.ServerAddress;
16+
17+
public UITestOptions Options { get; protected set; }
1618
}

src/OrchardCoreContrib.Testing.UI/UITestOfT.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,15 @@ public class UITest<TStartup>(BrowserType browserType = BrowserType.Edge, bool h
2424
/// <inheritdoc/>
2525
public async Task InitializeAsync()
2626
{
27+
Options = new UITestOptions
28+
{
29+
BrowserType = browserType,
30+
Headless = headless
31+
};
32+
2733
_playwright = await Playwright.CreateAsync();
2834

29-
Browser = await BrowserFactory.CreateAsync(_playwright, browserType, headless);
35+
Browser = await BrowserFactory.CreateAsync(_playwright, Options);
3036
}
3137

3238
/// <inheritdoc/>

0 commit comments

Comments
 (0)