24 Commits

Author SHA1 Message Date
Dmitry Gozman
18292325b6
api: add waitForElementState('disabled') (#3537)
Allows waiting for the element to be disabled.
2020-08-19 17:20:10 -07:00
Dmitry Gozman
3cf48f9bd4
chore: simplify conversions around setInputFiles (#3516)
We do not need api types on the server side anymore.
2020-08-18 17:32:11 -07:00
Dmitry Gozman
0e9793c452
api: ElementHandle.waitForElementState (#3501)
This method waits for visible, hidden, stable or enabled state,
similar to the actionability checks performed before actions.

This gives a bit more control to the user. Some examples:
- Allows to wait for something to be stable before taking a screenshot.
- Allows to wait for the element to be hidden/detached after a specific action.
2020-08-17 16:22:34 -07:00
Dmitry Gozman
69e1e713ef
feat(click): provide preview of the element intercepting pointer events (#3449) 2020-08-14 14:48:36 -07:00
Dmitry Gozman
9132d23b2b
fix(screenshot): wait for stable position before taking element screenshot (#3216)
Same goes for scrollIntoViewIfNeeded.
2020-07-29 16:36:02 -07:00
Dmitry Gozman
0f0e2acfaf
fix(type): unify selection behavior when typing (#3141)
Before typing/pressing, we focus the target element. WebKit
sometimes selects the value in this case. To unify the behavior
between the browsers we behave similar to human:
- when the input is already focused, we just type;
- when the input is not focused, we focus it, move caret
  to the start (like if user clicked at the start to focus the input)
  and then type.
Note this only affects inputs with non-empty value.
2020-07-24 09:30:31 -07:00
Dmitry Gozman
5d5cf26a0e
fix(logs): streaming logs from InjectedScriptPoll without exception (#2712)
We used to get undefined messages, because we were mistakenly
fulfilling the logs multiple times.
2020-06-25 13:13:10 -07:00
Dmitry Gozman
39ce35e154
fix(errors): strict error handling around element operations (#2567)
- Gave all possible dom errors distinct names, and throw them on the node side.
- Separated errors into FatalDOMError and RetargetableDOMError.
  Fatal errors are unrecoverable. Retargetable errors
  could be resolved by requerying the selector.
- This exposed a number of unhandled 'notconnected' cases.
- Added helper functions to handle errors and ensure TypeScript catches
  unhandled ones.
2020-06-24 15:12:17 -07:00
Dmitry Gozman
d0a6e1a64e
fix(dom): make selectText and scrollIntoViewIfNeeded wait for visible (#2628)
All other methods wait for the element to be visible, so we should make
them behave similarly.
2020-06-23 13:02:31 -07:00
Pavel Feldman
f2c47b1d33
feat(cli): introduce basic playwright CLI tool (#2571) 2020-06-14 17:24:45 -07:00
Dmitry Gozman
d4c466868b
chore: explicitly plumb various errors through the retries (#2554)
We are about to have more errors, so explicit plumbing helps with visibility.
2020-06-12 14:59:26 -07:00
Dmitry Gozman
c4e8720eb5
feat(debug): generate preview for ElementHandle (#2549)
This is a best-effort debugging feature - we try to generate preview asynchronously,
so it might not be available immediately.
2020-06-12 11:10:18 -07:00
Pavel Feldman
894826dec0
chore: form the debug script for authoring hints / helpers (#2551) 2020-06-11 18:18:33 -07:00
Dmitry Gozman
c99f0d1f98
feat(debug): more logs while waiting for stable, enabled, etc. (#2531) 2020-06-10 18:45:18 -07:00
Dmitry Gozman
55cfff38c6
fix(waitForFunction): handle predicate that throws (#2488)
Currently, we fail when the predicate throws on the first call,
and timeout when it fails on any other call.

There are two possible ways to handle throwing predicates:
- Fail waitForFunction if predicate throws once. This is good
  since it gives you the error faster.
- Tolerate predicate exceptions. This is good because you do
  not have to worry about non-initialized state during load.

This change implements the former.
2020-06-08 16:29:29 -07:00
Dmitry Gozman
5c3a275270
feat(debug): improve api logs (#2481) 2020-06-06 20:59:06 -07:00
Dmitry Gozman
a644f0a881
feat(fill): wait for the element to be enabled/writable/visible (#2435) 2020-06-01 18:56:49 -07:00
Dmitry Gozman
bf67245de6
feat(debug): stream logs from waitForSelector (#2434)
- we can now stream logs from InjectedScriptProgress to Progress;
- waitForSelector task uses it to report intermediate elements.
2020-06-01 15:48:23 -07:00
Dmitry Gozman
8f350e4fe6
chore: make polling in page cancelable from node (#2399)
- unifies polling timeouts with everything else,
  based on the client time instead of the server time;
- prepares polling tasks for cancellation token
  behavior.

Unfortunately, RerunnableTask had to be rewritten almost
entirely.
2020-05-30 15:00:53 -07:00
Dmitry Gozman
acf059fe00
fix(click): wait for button, input and select to be enabled before clicking (#2414) 2020-05-30 13:29:46 -07:00
Dmitry Gozman
ece4789165
feat(debug): expose playwright object in console (#2365)
- playwright.$ and playwright.$$ to query elements;
- playwright.inspect to reveal an element;
- playwright.clear to remove highlight.
2020-05-27 22:16:54 -07:00
Dmitry Gozman
4413138cc6
fix(fill): allow to clear number input (#2376) 2020-05-27 20:01:08 -07:00
Andrey Lushnikov
545c43d28d
fix: better hittarget testing for clicking (#2217)
While checking for hittarget, we first bubble from a target element
up to find the first element without `pointer-events: none` style.

This bubbling does not make much sense: we risk desperately clicking
"body" element, when we were actually asked to click some deeply-nested
"span".

Additionally, in many cases the original intent is to click a button. In this
case, we should use the enclosing "button" as a hit target directly.

Fixes #2175
2020-05-19 16:27:56 -07:00
Pavel Feldman
99b7aaace8
chore: refactor injected script harness (#2259) 2020-05-15 15:21:49 -07:00