.net - 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;
}
解决方案
这看起来像是我们在剧作家敏锐存储库中收到的一个问题的“重复”。
为了完整起见,我将在此处添加相同的代码。我假设这是关于在单元测试中运行 Playwright Sharp 的。具体来说,我为此使用 Xunit。我们在 Playwright Sharp 测试中使用相同的方法。
首先,如果要在测试中重用对象,则定义 aaFixture
和 a 。这里有更多关于它的文章。Collection
Browser
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
.
推荐阅读
- html - 如何防止 side 元素导致我的网站必须向右滚动
- c# - HttpClient, Post 方法 POST 方法
- react-redux - React Leaflet / Redux - 搜索系统中的错误
- python - 如何使用命令保存消息,然后使用 json 使用另一个命令获取消息?
- node.js - npm 错误!吉普错误!堆栈错误:`make` 失败,退出代码:2
- azure - 为 Azure VM 生成 SSL 证书
- json - 使用 JQ 按名称更改 JSON 中的值
- javascript - 遍历嵌套的 JSON 对象
- mysql - 如何获取每个用户的最后一行
- c# - 如何从列表中获取指定值
和 T 是一个泛型类?