Skip to content

Commit

Permalink
fix(isVisible): do not wait for the selector to be resolved (#5393)
Browse files Browse the repository at this point in the history
  • Loading branch information
dgozman committed Feb 10, 2021
1 parent 4d4efcc commit 78ab295
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 12 deletions.
6 changes: 3 additions & 3 deletions docs/src/api/class-frame.md
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
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
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
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
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

0 comments on commit 78ab295

Please sign in to comment.