首页 > 解决方案 > PlayWright-Sharp 的好的 PageObject 示例似乎不存在

问题描述

我正在寻找一个好的 PageObject 示例::

这是我正在尝试的示例...但是当我从另一个文件开始测试时... InstallAsync() 开始测试,当然会失败,因为 ipage 为空

为什么没有返回 ipage 对象?

public async Task<IPage> LaunchChrome()
        {

                await Playwright.InstallAsync();
                using var playwright = await Playwright.CreateAsync();
                await using var browser = await playwright.Webkit.LaunchAsync(headless: false);

                var page = await browser.NewPageAsync();

            return page;
        }

标签: .net.net-coreplaywright-sharp

解决方案


这看起来像是我们在剧作家敏锐存储库中收到的一个问题的“重复”。

为了完整起见,我将在此处添加相同的代码。我假设这是关于在单元测试中运行 Playwright Sharp 的。具体来说,我为此使用 Xunit。我们在 Playwright Sharp 测试中使用相同的方法。

首先,如果要在测试中重用对象,则定义 aaFixture和 a 。这里有更多关于它的文章。CollectionBrowser

public class BrowserTestFixture : IAsyncLifetime
{
    public IPlaywright PlaywrightContext { get; private set; }
    public IChromiumBrowser Browser { get; private set; }

    public async Task InitializeAsync()
    {
        this.PlaywrightContext = await Playwright.CreateAsync();
        this.Browser = await this.PlaywrightContext.Chromium.LaunchAsync(headless: false);
    }

    public async Task DisposeAsync()
    {
        PlaywrightContext?.Dispose();
    }
}

[CollectionDefinition("Browser Collection")]
public class BrowserCollection : ICollectionFixture<BrowserTestFixture>
{
   // This class has no code, and is never created. Its purpose is simply
    // to be the place to apply [CollectionDefinition] and all the
    // ICollectionFixture<> interfaces.
}

此时,您的测试可以通过Fixture在构造函数中包含该引用来重用这些对象。我使用的示例在这里:

public class UnitTest1 : IClassFixture<BrowserTestFixture>
{
    private readonly BrowserTestFixture browserTestFixture;

    public UnitTest1(BrowserTestFixture browserTestFixture)
    {
        this.browserTestFixture = browserTestFixture;
    }

    [Fact]
    public async Task HeadlineIsThere()
    {
        var page = await browserTestFixture.Browser.NewPageAsync();
        await page.GoToAsync("https://www.github.com");            

        var content = await page.GetTextContentAsync("h1");
        Assert.Equal("...", content);
    }

    [Fact]
    public async Task CookieConsentDialogIsShownAndDissmisable()
    {
        var page = await browserTestFixture.Browser.NewPageAsync();
        await page.GoToAsync("https://www.github.com");

        var cookieDialogContents = await page.GetTextContentAsync(".cc-message");
        Assert.True(!string.IsNullOrEmpty(cookieDialogContents));

        await page.ClickAsync("[aria-label='dismiss cookie message']");
        // ...
    }
}

现在,我明确希望IPage每次都创建一个新对象,但如果您坚持重复使用/共享它,您可以调整示例,即提供一个PageTestFixture.


推荐阅读