Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(isVisible): do not wait for the selector to be resolved #5393

Merged
merged 1 commit into from
Feb 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/src/api/class-frame.md
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ If the function passed to the [`method: Frame.evaluate`] returns a [Promise], th
resolve and return its value.

If the function passed to the [`method: Frame.evaluate`] returns a non-[Serializable] value, then
[`method: Frame.evaluate`] returns `undefined`. Playwright also supports transferring some
[`method: Frame.evaluate`] returns `undefined`. Playwright also supports transferring some
additional values that are not serializable by `JSON`: `-0`, `NaN`, `Infinity`, `-Infinity`.

```js
Expand Down Expand Up @@ -723,7 +723,7 @@ Returns whether the element is [enabled](./actionability.md#enabled).
## async method: Frame.isHidden
- returns: <[boolean]>

Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible).
Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible). [`option: selector`] that does not match any elements is considered hidden.

### param: Frame.isHidden.selector = %%-input-selector-%%

Expand All @@ -732,7 +732,7 @@ Returns whether the element is hidden, the opposite of [visible](./actionability
## async method: Frame.isVisible
- returns: <[boolean]>

Returns whether the element is [visible](./actionability.md#visible).
Returns whether the element is [visible](./actionability.md#visible). [`option: selector`] that does not match any elements is considered not visible.

### param: Frame.isVisible.selector = %%-input-selector-%%

Expand Down
4 changes: 2 additions & 2 deletions docs/src/api/class-page.md
Original file line number Diff line number Diff line change
Expand Up @@ -1448,7 +1448,7 @@ Returns whether the element is [enabled](./actionability.md#enabled).
## async method: Page.isHidden
- returns: <[boolean]>

Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible).
Returns whether the element is hidden, the opposite of [visible](./actionability.md#visible). [`option: selector`] that does not match any elements is considered hidden.

### param: Page.isHidden.selector = %%-input-selector-%%

Expand All @@ -1457,7 +1457,7 @@ Returns whether the element is hidden, the opposite of [visible](./actionability
## async method: Page.isVisible
- returns: <[boolean]>

Returns whether the element is [visible](./actionability.md#visible).
Returns whether the element is [visible](./actionability.md#visible). [`option: selector`] that does not match any elements is considered not visible.

### param: Page.isVisible.selector = %%-input-selector-%%

Expand Down
5 changes: 2 additions & 3 deletions src/server/frames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -946,11 +946,10 @@ export class Frame extends SdkObject {

async isVisible(metadata: CallMetadata, selector: string, options: types.TimeoutOptions = {}): Promise<boolean> {
const controller = new ProgressController(metadata, this);
const info = this._page.selectors._parseSelector(selector);
const task = dom.visibleTask(info);
return controller.run(async progress => {
progress.log(` checking visibility of "${selector}"`);
return this._scheduleRerunnableTask(progress, info.world, task);
const element = await this.$(selector);
return element ? await element.isVisible() : false;
}, this._page._timeoutSettings.timeout(options));
}

Expand Down
5 changes: 5 additions & 0 deletions test/elementhandle-convenience.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,16 +159,21 @@ it('getAttribute should be atomic', async ({ playwright, page }) => {

it('isVisible and isHidden should work', async ({ page }) => {
await page.setContent(`<div>Hi</div><span></span>`);

const div = await page.$('div');
expect(await div.isVisible()).toBe(true);
expect(await div.isHidden()).toBe(false);
expect(await page.isVisible('div')).toBe(true);
expect(await page.isHidden('div')).toBe(false);

const span = await page.$('span');
expect(await span.isVisible()).toBe(false);
expect(await span.isHidden()).toBe(true);
expect(await page.isVisible('span')).toBe(false);
expect(await page.isHidden('span')).toBe(true);

expect(await page.isVisible('no-such-element')).toBe(false);
expect(await page.isHidden('no-such-element')).toBe(true);
});

it('isEnabled and isDisabled should work', async ({ page }) => {
Expand Down
12 changes: 8 additions & 4 deletions types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2037,7 +2037,8 @@ export interface Page {
}): Promise<boolean>;

/**
* Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/docs/actionability#visible).
* Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/docs/actionability#visible). `selector` that does not
* match any elements is considered hidden.
* @param selector A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See [working with selectors](https://playwright.dev/docs/selectors) for more details.
* @param options
*/
Expand All @@ -2052,7 +2053,8 @@ export interface Page {
}): Promise<boolean>;

/**
* Returns whether the element is [visible](https://playwright.dev/docs/actionability#visible).
* Returns whether the element is [visible](https://playwright.dev/docs/actionability#visible). `selector` that does not match any elements is
* considered not visible.
* @param selector A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See [working with selectors](https://playwright.dev/docs/selectors) for more details.
* @param options
*/
Expand Down Expand Up @@ -3992,7 +3994,8 @@ export interface Frame {
}): Promise<boolean>;

/**
* Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/docs/actionability#visible).
* Returns whether the element is hidden, the opposite of [visible](https://playwright.dev/docs/actionability#visible). `selector` that does not
* match any elements is considered hidden.
* @param selector A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See [working with selectors](https://playwright.dev/docs/selectors) for more details.
* @param options
*/
Expand All @@ -4007,7 +4010,8 @@ export interface Frame {
}): Promise<boolean>;

/**
* Returns whether the element is [visible](https://playwright.dev/docs/actionability#visible).
* Returns whether the element is [visible](https://playwright.dev/docs/actionability#visible). `selector` that does not match any elements is
* considered not visible.
* @param selector A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See [working with selectors](https://playwright.dev/docs/selectors) for more details.
* @param options
*/
Expand Down