fix(dotnet): codegen/docs use Name instead of NameString (#19156)

This commit is contained in:
Dmitry Gozman 2022-11-29 20:56:18 -08:00 committed by GitHub
parent 5ac426b3d5
commit 307a0b6ea7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 43 additions and 43 deletions

View file

@ -73,7 +73,7 @@ dotnet build
pwsh bin/Debug/netX/playwright.ps1 install
```
If `pwsh` is not available, you have to [install PowerShell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell).
If `pwsh` is not available, you have to [install PowerShell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell).
## Add Example Tests
@ -110,7 +110,7 @@ public class Tests : PageTest
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
// create a locator
var getStarted = Page.GetByRole(AriaRole.Link, new() { NameString = "Get started" });
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
// Expect an attribute "to be strictly equal" to the value.
await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/intro");
@ -145,7 +145,7 @@ public class UnitTest1 : PageTest
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
// create a locator
var getStarted = Page.GetByRole(AriaRole.Link, new() { NameString = "Get started" });
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
// Expect an attribute "to be strictly equal" to the value.
await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/intro");

View file

@ -64,14 +64,14 @@ await page.GetByLabel("User Name").FillAsync("John");
await page.GetByLabel("Password").FillAsync("secret-password");
await page.GetByRole(AriaRole.Button, new() { NameString = "Sign in" }).ClickAsync();
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
await Expect(page.GetByText("Welcome, John!")).ToBeVisibleAsync();
```
## Locating elements
Playwright comes with multiple built-in locators. To make tests resilient, we recommend prioritizing user-facing attributes and explicit contracts such as [`method: Page.getByRole`].
Playwright comes with multiple built-in locators. To make tests resilient, we recommend prioritizing user-facing attributes and explicit contracts such as [`method: Page.getByRole`].
For example, consider the following DOM structure.
@ -99,7 +99,7 @@ page.get_by_role("button", name="Sign in").click()
```
```csharp
await page.GetByRole(AriaRole.Button, new() { NameString = "Sign in" }).ClickAsync();
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
```
:::tip
@ -141,7 +141,7 @@ locator.click()
```
```csharp
var locator = page.GetByRole(AriaRole.Button, new() { NameString = "Sign in" })
var locator = page.GetByRole(AriaRole.Button, new() { Name = "Sign in" })
await locator.HoverAsync();
await locator.ClickAsync();
@ -180,7 +180,7 @@ locator.click()
```csharp
var locator = page
.FrameLocator("#my-frame")
.GetByRole(AriaRole.Button), new() { NameString = "Sign in" });
.GetByRole(AriaRole.Button), new() { Name = "Sign in" });
await locator.ClickAsync();
```
@ -244,11 +244,11 @@ page.getByRole(AriaRole.BUTTON,
```csharp
await Expect(page
.GetByRole(AriaRole.Heading, new() { NameString = "Sign up" }))
.GetByRole(AriaRole.Heading, new() { Name = "Sign up" }))
.ToBeVisibleAsync();
await page
.GetByRole(AriaRole.Checkbox, new() { NameString = "Subscribe" })
.GetByRole(AriaRole.Checkbox, new() { Name = "Subscribe" })
.CheckAsync();
await page
@ -594,7 +594,7 @@ playwright.selectors.set_test_id_attribute("data-pw")
playwright.Selectors.SetTestIdAttribute("data-pw");
```
In your html you can now use `data-pw` as your test id instead of the default `data-testid`.
In your html you can now use `data-pw` as your test id instead of the default `data-testid`.
```html card
<button data-pw="directions">Itinéraire</button>
@ -773,7 +773,7 @@ page.locator("x-details", has_text="Details" ).click()
```
```csharp
await page
.Locator("x-details", new() { HasTextString = "Details" })
.Locator("x-details", new() { HasText = "Details" })
.ClickAsync();
```
@ -851,8 +851,8 @@ page.get_by_role("listitem").filter(has_text="Product 2").get_by_role(
```csharp
await page
.GetByRole(AriaRole.Listitem)
.Filter(new() { HasTextString = "Product 2" })
.GetByRole(AriaRole.Button, new () { NameString = "Add to cart" })
.Filter(new() { HasText = "Product 2" })
.GetByRole(AriaRole.Button, new () { Name = "Add to cart" })
.ClickAsync();
```
@ -891,7 +891,7 @@ page.get_by_role("listitem").filter(has_text=re.compile("Product 2")).get_by_rol
await page
.GetByRole(AriaRole.Listitem)
.Filter(new() { HasTextRegex = new Regex("Product 2") })
.GetByRole(AriaRole.Button, new () { NameString = "Add to cart" })
.GetByRole(AriaRole.Button, new () { Name = "Add to cart" })
.ClickAsync();
```
@ -945,10 +945,10 @@ await page
.GetByRole(AriaRole.Listitem)
.Filter(new() {
Has = page.GetByRole(AriaRole.Heading, new () {
NameString = "Product 2"
Name = "Product 2"
})
})
.GetByRole(AriaRole.Button, new () { NameString = "Add to cart" })
.GetByRole(AriaRole.Button, new () { Name = "Add to cart" })
.ClickAsync();
```
@ -1035,10 +1035,10 @@ product
```csharp
var product = page
.GetByRole(AriaRole.Listitem)
.Filter(new() { HasTextString = "Product 2" });
.Filter(new() { HasText = "Product 2" });
await product
.GetByRole(AriaRole.Button), new() { NameString = "Add to cart" })
.GetByRole(AriaRole.Button), new() { Name = "Add to cart" })
.ClickAsync();
```
@ -1208,7 +1208,7 @@ page.getByRole(AriaRole.LISTITEM)
```csharp
await page
.GetByRole(AriaRole.Listitem)
.Filter(new() { HasTextString = "orange" })
.Filter(new() { HasText = "orange" })
.ClickAsync();
```
@ -1345,9 +1345,9 @@ rowLocator
var rowLocator = page.GetByRole(AriaRole.Listitem);
await rowLocator
.Filter(new() { HasTextString = "Mary" })
.Filter(new() { HasText = "Mary" })
.Filter(new() {
Has = page.GetByRole(AriaRole.Button), new() { NameString = "Say goodbye" })
Has = page.GetByRole(AriaRole.Button), new() { Name = "Say goodbye" })
})
.ScreenshotAsync(new() { Path = "screenshot.png" });
```

View file

@ -36,7 +36,7 @@ public class Tests : PageTest
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
// create a locator
var getStarted = Page.GetByRole(AriaRole.Link, new() { NameString = "Get started" });
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
// Expect an attribute "to be strictly equal" to the value.
await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/intro");
@ -71,7 +71,7 @@ public class UnitTest1 : PageTest
await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
// create a locator
var getStarted = Page.GetByRole(AriaRole.Link, new() { NameString = "Get started" });
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
// Expect an attribute "to be strictly equal" to the value.
await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/intro");
@ -102,7 +102,7 @@ await Expect(Page).ToHaveTitleAsync(new Regex("Playwright"));
[Locators](./locators.md) are the central piece of Playwright's auto-waiting and retry-ability. Locators represent a way to find element(s) on the page at any moment and are used to perform actions on elements such as `.ClickAsync` `.FillAsync` etc.
```csharp
var getStarted = Page.GetByRole(AriaRole.Link, new() { NameString = "Get started" });
var getStarted = Page.GetByRole(AriaRole.Link, new() { Name = "Get started" });
await Expect(getStarted).ToHaveAttributeAsync("href", "/docs/installation");
await getStarted.ClickAsync();

View file

@ -387,7 +387,7 @@ export class CSharpLocatorFactory implements LocatorFactory {
if (isRegExp(options.name)) {
attrs.push(`NameRegex = ${this.regexToString(options.name)}`);
} else if (typeof options.name === 'string') {
attrs.push(`NameString = ${this.quote(options.name)}`);
attrs.push(`Name = ${this.quote(options.name)}`);
if (options.exact)
attrs.push(`Exact = true`);
}
@ -432,7 +432,7 @@ export class CSharpLocatorFactory implements LocatorFactory {
private toHasText(body: string | RegExp) {
if (isRegExp(body))
return `HasTextRegex = ${this.regexToString(body)}`;
return `HasTextString = ${this.quote(body)}`;
return `HasText = ${this.quote(body)}`;
}
private quote(text: string) {

View file

@ -47,7 +47,7 @@ test.describe('cli codegen', () => {
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Submit")).click()`);
expect.soft(sources.get('C#').text).toContain(`
await page.GetByRole(AriaRole.Button, new() { NameString = "Submit" }).ClickAsync();`);
await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).ClickAsync();`);
expect(message.text()).toBe('click');
});
@ -189,7 +189,7 @@ test.describe('cli codegen', () => {
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Submit")).click()`);
expect.soft(sources.get('C#').text).toContain(`
await page.GetByRole(AriaRole.Button, new() { NameString = "Submit" }).ClickAsync();`);
await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).ClickAsync();`);
expect(message.text()).toBe('click');
});
@ -630,7 +630,7 @@ test.describe('cli codegen', () => {
expect.soft(sources.get('C#').text).toContain(`
var page1 = await page.RunAndWaitForPopupAsync(async () =>
{
await page.GetByRole(AriaRole.Link, new() { NameString = "link" }).ClickAsync();
await page.GetByRole(AriaRole.Link, new() { Name = "link" }).ClickAsync();
});`);
expect(popup.url()).toBe('about:blank');

View file

@ -258,7 +258,7 @@ test.describe('cli codegen', () => {
expect.soft(sources.get('C#').text).toContain(`
var download1 = await page.RunAndWaitForDownloadAsync(async () =>
{
await page.GetByRole(AriaRole.Link, new() { NameString = "Download" }).ClickAsync();
await page.GetByRole(AriaRole.Link, new() { Name = "Download" }).ClickAsync();
});`);
});
@ -306,7 +306,7 @@ test.describe('cli codegen', () => {
page.Dialog -= page_Dialog1_EventHandler;
}
page.Dialog += page_Dialog1_EventHandler;
await page.GetByRole(AriaRole.Button, new() { NameString = "click me" }).ClickAsync();`);
await page.GetByRole(AriaRole.Button, new() { Name = "click me" }).ClickAsync();`);
});

View file

@ -49,7 +49,7 @@ test.describe('cli codegen', () => {
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Submit")).first().click();`);
expect.soft(sources.get('C#').text).toContain(`
await page.GetByRole(AriaRole.Button, new() { NameString = "Submit" }).First.ClickAsync();`);
await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).First.ClickAsync();`);
expect(message.text()).toBe('click1');
});
@ -84,7 +84,7 @@ test.describe('cli codegen', () => {
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Submit")).nth(1).click();`);
expect.soft(sources.get('C#').text).toContain(`
await page.GetByRole(AriaRole.Button, new() { NameString = "Submit" }).Nth(1).ClickAsync();`);
await page.GetByRole(AriaRole.Button, new() { Name = "Submit" }).Nth(1).ClickAsync();`);
expect(message.text()).toBe('click2');
});
@ -226,7 +226,7 @@ test.describe('cli codegen', () => {
await page.frame_locator("#frame1").get_by_role("button", name="Submit").click()`);
expect.soft(sources.get('C#').text).toContain(`
await page.FrameLocator("#frame1").GetByRole(AriaRole.Button, new() { NameString = "Submit" }).ClickAsync();`);
await page.FrameLocator("#frame1").GetByRole(AriaRole.Button, new() { Name = "Submit" }).ClickAsync();`);
});
test('should generate getByTestId', async ({ page, openRecorder }) => {

View file

@ -186,7 +186,7 @@ it('reverse engineer getByRole', async ({ page }) => {
javascript: `getByRole('button', { name: 'Hello' })`,
python: `get_by_role("button", name="Hello")`,
java: `getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Hello"))`,
csharp: `GetByRole(AriaRole.Button, new() { NameString = "Hello" })`,
csharp: `GetByRole(AriaRole.Button, new() { Name = "Hello" })`,
});
expect.soft(generate(page.getByRole('button', { name: /Hello/ }))).toEqual({
javascript: `getByRole('button', { name: /Hello/ })`,
@ -198,7 +198,7 @@ it('reverse engineer getByRole', async ({ page }) => {
javascript: `getByRole('button', { name: 'He"llo', exact: true })`,
python: `get_by_role("button", name="He\\"llo", exact=True)`,
java: `getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("He\\"llo").setExact(true))`,
csharp: `GetByRole(AriaRole.Button, new() { NameString = "He\\"llo", Exact = true })`,
csharp: `GetByRole(AriaRole.Button, new() { Name = "He\\"llo", Exact = true })`,
});
expect.soft(generate(page.getByRole('button', { checked: true, pressed: false, level: 3 }))).toEqual({
javascript: `getByRole('button', { checked: true, level: 3, pressed: false })`,
@ -270,7 +270,7 @@ it('reverse engineer locators with regex', async ({ page }) => {
it('reverse engineer hasText', async ({ page }) => {
expect.soft(generate(page.getByText('Hello').filter({ hasText: 'wo"rld\n' }))).toEqual({
csharp: `GetByText("Hello").Filter(new() { HasTextString = "wo\\"rld\\n" })`,
csharp: `GetByText("Hello").Filter(new() { HasText = "wo\\"rld\\n" })`,
java: `getByText("Hello").filter(new Locator.LocatorOptions().setHasText("wo\\"rld\\n"))`,
javascript: `getByText('Hello').filter({ hasText: 'wo"rld\\n' })`,
python: `get_by_text("Hello").filter(has_text="wo\\"rld\\n")`,
@ -305,7 +305,7 @@ it('reverse engineer has', async ({ page }) => {
.filter({ hasText: 'foo' })
.filter({ has: page.locator('a') });
expect.soft(generate(locator)).toEqual({
csharp: `Locator("section").Filter(new() { Has = Locator("div").Filter(new() { Has = Locator("span") }) }).Filter(new() { HasTextString = "foo" }).Filter(new() { Has = Locator("a") })`,
csharp: `Locator("section").Filter(new() { Has = Locator("div").Filter(new() { Has = Locator("span") }) }).Filter(new() { HasText = "foo" }).Filter(new() { Has = Locator("a") })`,
java: `locator("section").filter(new Locator.LocatorOptions().setHas(locator("div").filter(new Locator.LocatorOptions().setHas(locator("span"))))).filter(new Locator.LocatorOptions().setHasText("foo")).filter(new Locator.LocatorOptions().setHas(locator("a")))`,
javascript: `locator('section').filter({ has: locator('div').filter({ has: locator('span') }) }).filter({ hasText: 'foo' }).filter({ has: locator('a') })`,
python: `locator("section").filter(has=locator("div").filter(has=locator("span"))).filter(has_text="foo").filter(has=locator("a"))`,
@ -342,7 +342,7 @@ it.describe(() => {
<div>Goodbye <span mark=1>world</span></div>
`);
expect.soft(await generateForNode(page, '[mark="1"]')).toEqual({
csharp: 'Locator("div").Filter(new() { HasTextString = "Goodbye world" }).Locator("span")',
csharp: 'Locator("div").Filter(new() { HasText = "Goodbye world" }).Locator("span")',
java: 'locator("div").filter(new Locator.LocatorOptions().setHasText("Goodbye world")).locator("span")',
javascript: `locator('div').filter({ hasText: 'Goodbye world' }).locator('span')`,
python: 'locator("div").filter(has_text="Goodbye world").locator("span")',
@ -354,7 +354,7 @@ it('parse locators strictly', () => {
const selector = 'div >> internal:has-text=\"Goodbye world\"i >> span';
// Exact
expect.soft(parseLocator('csharp', `Locator("div").Filter(new() { HasTextString = "Goodbye world" }).Locator("span")`)).toBe(selector);
expect.soft(parseLocator('csharp', `Locator("div").Filter(new() { HasText = "Goodbye world" }).Locator("span")`)).toBe(selector);
expect.soft(parseLocator('java', `locator("div").filter(new Locator.LocatorOptions().setHasText("Goodbye world")).locator("span")`)).toBe(selector);
expect.soft(parseLocator('javascript', `locator('div').filter({ hasText: 'Goodbye world' }).locator('span')`)).toBe(selector);
expect.soft(parseLocator('python', `locator("div").filter(has_text="Goodbye world").locator("span")`)).toBe(selector);
@ -364,13 +364,13 @@ it('parse locators strictly', () => {
expect.soft(parseLocator('python', `locator('div').filter(has_text='Goodbye world').locator('span')`)).toBe(selector);
// Whitespace
expect.soft(parseLocator('csharp', `Locator("div") . Filter (new ( ) { HasTextString = "Goodbye world" }).Locator( "span" )`)).toBe(selector);
expect.soft(parseLocator('csharp', `Locator("div") . Filter (new ( ) { HasText = "Goodbye world" }).Locator( "span" )`)).toBe(selector);
expect.soft(parseLocator('java', ` locator("div" ). filter( new Locator. LocatorOptions ( ) .setHasText( "Goodbye world" ) ).locator( "span")`)).toBe(selector);
expect.soft(parseLocator('javascript', `locator\n('div')\n\n.filter({ hasText : 'Goodbye world'\n }\n).locator('span')\n`)).toBe(selector);
expect.soft(parseLocator('python', `\tlocator(\t"div").filter(\thas_text="Goodbye world"\t).locator\t("span")`)).toBe(selector);
// Extra symbols
expect.soft(parseLocator('csharp', `Locator("div").Filter(new() { HasTextString = "Goodbye world" }).Locator("span"))`)).not.toBe(selector);
expect.soft(parseLocator('csharp', `Locator("div").Filter(new() { HasText = "Goodbye world" }).Locator("span"))`)).not.toBe(selector);
expect.soft(parseLocator('java', `locator("div").filter(new Locator.LocatorOptions().setHasText("Goodbye world"))..locator("span")`)).not.toBe(selector);
expect.soft(parseLocator('javascript', `locator('div').filter({ hasText: 'Goodbye world' }}).locator('span')`)).not.toBe(selector);
expect.soft(parseLocator('python', `locator("div").filter(has_text=="Goodbye world").locator("span")`)).not.toBe(selector);