Commit Graph

65 Commits

Author SHA1 Message Date
Alex Rudenko
cfaaa5e2c0 fix: suppress init errors if the target is closed (#8947)
With #8520 Puppeteer is now aware of all targets it connects
to. In order to have a not flaky init, Puppeteer waits for
all existing targets to be configured during the connection process.
This does not work well in case of concurrent connections because
while one connection might initializing a target the other one
might be closed it. In general, that is expected because we
can only be eventually consistent about the target state but we
also should not crash the init if some targets have been closed.
This PR implements checks to see if the errors are caused by the
target or session closures and suppresses them if it's the case.
2022-09-15 02:15:00 +02:00
Alex Rudenko
7b42250c7b
fix: restore deferred promise debugging (#8895)
* fix: restore deferred promise debugging

* chore: strict types
2022-09-05 10:30:47 +02:00
jrandolf
9f5cb670e8
chore: consolidate deferred promise (#8863)
* fix: forward timeout waitForFileChooser

* chore: consolidate deferred promise

Co-authored-by: Alex Rudenko <OrKoN@users.noreply.github.com>
2022-08-30 16:24:51 +02:00
Alex Rudenko
202ffce0aa
fix: remove deferred promise timeouts (#8835)
Issue #8832 makes a good point that we should not be making
implicit assumptions about the client's performance
when waiting for internal events. At the same time,
we want to be able to get the debug info if some promises
never resolve because of missing backend events.

This PR adds a variable to turn on timeouts for deferred
promises created using `createDebuggableDeferredPromise`.
We can use it in our tests to catch never-resolving
promises or when reproducing bug reports where Puppeteer
hangs indefinitely.

Closes #8832
2022-08-24 12:05:32 +02:00
jrandolf
51b2f0576d
chore: move Frame to Frame.ts (#8806) 2022-08-17 17:45:45 +02:00
jrandolf
bdcb748b98
chore: infrastructure for injecting scripts into DOMWorlds (#8801) 2022-08-17 14:39:41 +02:00
jrandolf
8f612d5ff8
fix: deprecate waitForTimeout (#8793) 2022-08-16 08:24:25 +02:00
jrandolf
b5da718e2e
fix: deprecate ExecutionContext (#8792) 2022-08-16 08:22:45 +02:00
jrandolf
ddbe88b887
chore: add custom rule for formatting comments (#8777) 2022-08-12 14:15:26 +02:00
jrandolf
d6a88a9768
chore: refactor FrameManager and fix docs (#8770) 2022-08-10 23:34:29 +02:00
Alex Rudenko
2580347b50
fix: resolve navigation flakiness (#8768)
Two main sources of flakiness addressed: 

1) we should dispose the lifecycle watcher after we waited for the navigation response (bad API? we need to refactor but I think it'd be valuable to stabilize tests first without too many changes).
2) we should wait for the navigation request's response if there is a navigation request in the watcher.

Closes #8644
2022-08-10 15:59:58 +00:00
jrandolf
837b10b15e
chore: rename DOMWorld to IsolatedWorld (#8761) 2022-08-09 15:17:42 +02:00
jrandolf
932a053d02
chore: move adoption to DOMWorld (#8760) 2022-08-09 14:55:18 +02:00
jrandolf
8be8f5ff72
chore: refactor deferred promise (#8759) 2022-08-09 13:29:12 +02:00
jrandolf
5cf9b4de8d
feat: use an xpath query handler (#8730) 2022-08-04 15:45:21 +02:00
Alex Rudenko
d2f6db2073 fix: use loaderId to reduce test flakiness (#8717) 2022-08-02 13:18:50 +00:00
Alex Rudenko
6f81b23728 fix: address flakiness in frame handling (#8688)
When we attach to a frame, we send a call to get
the page frame tree from CDP. Based on the tree data
we look up the parent frame if parentId is provided.
The problem is that the call to get the page frame
tree could take arbitrary time and the calls for the
parent and child frames might happen at the same time.
So the situation where the frame tree for the child frame
is resolved before the parent frame is known is fairly
common.

This PR addresses the issue by awaiting for the parent
frame id before attempting to register a child frame.
2022-08-02 13:18:47 +00:00
Alex Rudenko
2cbfdeb0ca feat: use CDP's auto-attach mechanism (#8520)
* feat: use CDP's auto-attach mechanism

In this PR, we refactor Puppeteer to make use of the CDP's auto-attach mechanism. This allows the backend to pause
new targets and give Puppeteer a chance to configure them properly. This fixes the flakiness related to dealing with
OOPIFs and should fix some other issues related to the network interception and navigations. If those are not fixed completely by this PR, the PR serves a solid base for fixing them.

Closes https://github.com/puppeteer/puppeteer/issues/8507, https://github.com/puppeteer/puppeteer/issues/7990
Unlocks https://github.com/puppeteer/puppeteer/issues/3667

BREAKING CHANGE: With Chromium, Puppeteer will now attach to page/iframe targets immediately to allow reliable configuration of targets.
2022-08-02 13:18:07 +00:00
Alex Rudenko
af08c5c903
feat: expose the page getter on Frame (#8657)
* feat: expose the page getter on Frame

Closes #8654

* test: add a test
2022-07-11 21:06:35 +02:00
jrandolf
5ff205dc8b
fix: extends ElementHandle to Nodes (#8552)
* fix: extends `ElementHandle` to `Node`s (#8552)
2022-07-06 09:05:37 +02:00
jrandolf
066f440ba7
feat: add documentation (#8593) 2022-07-01 11:52:39 +00:00
jrandolf
8100cbb295
fix: infer unioned handles (#8562) 2022-06-24 06:40:08 +00:00
jrandolf
ebcb8a2760
chore: split JSHandle.ts (#8551) 2022-06-23 11:31:43 +02:00
jrandolf
26c3acbb07
feat!: type inference for evaluation types (#8547)
This PR greatly improves the types within Puppeteer:

- **Almost everything** is auto-deduced.
  - Parameters don't need to be specified in the function. They are deduced from the spread.
  - Return types don't need to be specified. They are deduced from the function. (More on this below)
  - Selections based on tag names correctly deduce element type, similar to TypeScript's mechanism for `getElementByTagName`.
- [**BREAKING CHANGE**] We've removed the ability to declare return types in type arguments for the following reasons:
  1. Setting them will indubitably break auto-deduction.
  2. You can just use `as ...` in TypeScript to coerce the correct type (given it makes sense).
- [**BREAKING CHANGE**] `waitFor` is officially gone.

To migrate to these changes, there are only four things you may need to change:
- If you set a return type using the `ReturnType` type parameter, remove it and use `as ...` and `HandleFor` (if necessary).
 `evaluate<ReturnType>(a: number, b: number) => {...}, a, b)`
 `(await evaluate(a, b) => {...}, a, b)) as ReturnType`
 `evaluateHandle<ReturnType>(a: number, b: number) => {...}, a, b)`
 `(await evaluateHandle(a, b) => {...}, a, b)) as HandleFor<ReturnType>`
- If you set any type parameters in the *parameters* of an evaluation function, remove them.  
 `evaluate(a: number, b: number) => {...}, a, b)`
 `evaluate(a, b) => {...}, a, b)`
- If you set any type parameters in the method's declaration, remove them.
 `evaluate<(a: number, b: number) => void>((a, b) => {...}, a, b)`
 `evaluate(a, b) => {...}, a, b)`
2022-06-23 11:29:46 +02:00
jrandolf
84712cbc28
chore: use Google's TS style guide's format config (#8542) 2022-06-22 15:25:44 +02:00
jrandolf
ce0dd25349
chore: use braces in function bodies (#8525) 2022-06-15 12:42:21 +02:00
jrandolf
e6442dd767
chore: use curly (#8519) 2022-06-14 13:55:35 +02:00
jrandolf
0678343b53
chore: move helper.js to util.js (#8510) 2022-06-14 13:16:21 +02:00
jrandolf
6c960115a3
chore: use private fields (#8506) 2022-06-13 11:16:25 +02:00
jrandolf
4d359906a4
fix: use error-like (#8504) 2022-06-10 15:27:42 +02:00
jrandolf
b4e751f29c
feat: use strict typescript (#8401) 2022-05-31 16:34:16 +02:00
Alex Rudenko
c96c915b53
fix: do not use loaderId for lifecycle events (#8395)
This PR works around the upstream bug crbug.com/1325782. Previously Puppeteer relied on the presence of the loaderId to determine the kind of navigation and expected events. It does not look like there is a reason to do so: instead, we could see what events we get and proceed accordingly.
2022-05-30 10:30:30 +02:00
Alex Rudenko
04dbd8f39a
Revert "fix: do not use loaderId for Lifecycle events (#8353)" (#8369)
This reverts commit 7107d2d300.
2022-05-19 12:05:33 +00:00
Alex Rudenko
7107d2d300
fix: do not use loaderId for Lifecycle events (#8353) 2022-05-17 13:27:21 +00:00
jrandolf
74380303ac
fix: only check loading iframe in lifecycling (#8348) 2022-05-17 12:15:44 +00:00
Alex Rudenko
553959884f
fix: make sure inner OOPIFs can be attached to (#8304) 2022-05-04 07:46:38 +02:00
Cody Eakins
12260b19af
docs: fix small typo (#8195)
This commit fixes a single typo.

- functon -> function
2022-04-06 08:32:31 +00:00
Alex Rudenko
34775e5831
fix: waitForNavigation in OOPIFs (#8117) 2022-03-09 12:24:17 +01:00
Dima
309e8b80da fix(page): page.createIsolatedWorld error catching has been added (#7848)
Co-authored-by: DimaShustal <dzmitry.shustal@gmail.com>
Co-authored-by: Alex Rudenko <OrKoN@users.noreply.github.com>
2022-03-03 12:56:12 +01:00
jrandolf
e9278fcfcf
feat: export Frame._client through getter (#8041)
Co-authored-by: Randolf Jung <jrandolf@chromium.org>
2022-02-21 14:58:37 +00:00
Alex Rudenko
d7937b806d
fix: error for pre-existing OOPIFs (#7899)
Issues: #7844, #7896
2022-01-17 07:00:00 +00:00
Alex Rudenko
486bbe010d
fix: correctly compute clickable points for elements inside OOPIFs (#7900)
Issues: #7849
2022-01-17 07:32:52 +01:00
Alex Rudenko
ac162c561e
feat(chromium)!: roll to Chromium 97.0.4692.0 (r938248)
Issues: #7458
2021-11-23 08:19:14 +01:00
Alex Rudenko
23ee295f34
fix: null check for frame in FrameManager (#7773)
Issues: #7749
2021-11-15 13:33:45 +00:00
Jan Scheffler
4d9dc8c0e6
feat(oop iframes)!: integrate OOP iframes with the frame manager (#7556)
This pull request to adds better support for OOP iframes (see #2548)

The current problem with OOP iframes is that they are moved to a different target. Because of this, the previous versions of Puppeteer pretty much ignored them.
This change extends the FrameManager to already take OOP iframes into account and hides the fact that those frames are actually in different targets.
Further work needs to be done to also make the NetworkManager aware of these and to make sure that settings like emulations etc. are also properly passed down to the new targets.
2021-10-28 11:25:49 +02:00
Xavier Prud'homme
caa2b732fe
fix(frame): fix Frame.waitFor's XPath pattern detection (#5184)
Up to now, only strings starting with '//' are considered as to XPath selectors. Unfortunately, this is too restricting. This fix allows valid XPath selectors starting with: '/', './', and even '(//*[1])'
2021-09-15 11:45:59 +00:00
Jack Franklin
b349c91e7d
fix: make $ and $$ selectors generic (#6883)
* fix: make `$` and `$$` selectors generic

This means, much like TS's in built `querySelector` type, you can now do:

```ts
const listItems = page.$$<HTMLLIElement>('ul li');
```

And/or:

```ts
const h2 = page.$<HTMLHeadingElement>('h2');
```

And the return value will be of type `ElementHandle<T>|null`, where `T`
is the type you provided. By default `T` is an `Element`, so you don't
have to provide this if you don't care as a consumer about the exact
type you get back.

* chore: fix test assertions
2021-03-25 11:40:34 +00:00
dmitrysteblyuk
fb859115c0
fix: do not use old utility world (#6528)
Don’t use the old utility world, as it is being destroyed later when browser reconnects to the page.

Issue: #6527
2020-11-26 12:43:42 +01:00
Jack Franklin
f04bec5a15
chore: update eslint & eslint plugins (#6487)
Updates ESLint, the TypeScript ESLint plugins, and updates code where
the rules have changed.
2020-10-12 10:30:35 +01:00
Maksim Sadym
6f336eb978
feat(OOPIF): debug message in case of iFrame moved to another process (#6432)
Debug message clarifying the problem like `Issue 1060080: Event Network.loadingFinished is not sent when a frame is loaded from another domain`: https://bugs.chromium.org/p/chromium/issues/detail?id=1060080).
It can help users to identify problem with OOPIF easier without digging into the CDP protocol implementation like in the bug `1060080` mentioned above.

To reproduce:
1. Run `DEBUG="puppeteer:frame" NODE_PATH=../ node examples/oopif.js`.
2. Verify the output contains the debug message:
`
puppeteer:frame The frame '...' moved to another session. Out-of-proccess
iframes (OOPIF) are not supported by Puppeteer yet.
https://github.com/puppeteer/puppeteer/issues/2548
`
2020-09-21 13:23:36 +02:00