diff --git a/README.md b/README.md
index 1dd36df73..f76c89a14 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,9 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H
| | Linux | macOS | Windows |
| :--- | :---: | :---: | :---: |
-| Chromium 93.0.4543.0 | ✅ | ✅ | ✅ |
+| Chromium 93.0.4576.0 | ✅ | ✅ | ✅ |
| WebKit 14.2 | ✅ | ✅ | ✅ |
-| Firefox 89.0 | ✅ | ✅ | ✅ |
+| Firefox 90.0 | ✅ | ✅ | ✅ |
## Documentation
diff --git a/playwright/_impl/_browser_type.py b/playwright/_impl/_browser_type.py
index dff830f76..08aafc1f9 100644
--- a/playwright/_impl/_browser_type.py
+++ b/playwright/_impl/_browser_type.py
@@ -85,7 +85,7 @@ async def launch(
try:
return from_channel(await self._channel.send("launch", params))
except Exception as e:
- if "because executable doesn't exist" in str(e):
+ if "npx playwright install" in str(e):
raise not_installed_error(f'"{self.name}" browser was not found.')
raise e
@@ -145,7 +145,7 @@ async def launch_persistent_context(
context._options = params
return context
except Exception as e:
- if "because executable doesn't exist" in str(e):
+ if "npx playwright install" in str(e):
raise not_installed_error(f'"{self.name}" browser was not found.')
raise e
diff --git a/playwright/_impl/_frame.py b/playwright/_impl/_frame.py
index 268beb110..4e1047a8b 100644
--- a/playwright/_impl/_frame.py
+++ b/playwright/_impl/_frame.py
@@ -466,6 +466,17 @@ async def hover(
) -> None:
await self._channel.send("hover", locals_to_params(locals()))
+ async def drag_and_drop(
+ self,
+ source: str,
+ target: str,
+ force: bool = None,
+ noWaitAfter: bool = None,
+ timeout: float = None,
+ trial: bool = None,
+ ) -> None:
+ await self._channel.send("dragAndDrop", locals_to_params(locals()))
+
async def select_option(
self,
selector: str,
diff --git a/playwright/_impl/_page.py b/playwright/_impl/_page.py
index e230d43ed..ed756bf38 100644
--- a/playwright/_impl/_page.py
+++ b/playwright/_impl/_page.py
@@ -649,6 +649,17 @@ async def hover(
) -> None:
return await self._main_frame.hover(**locals_to_params(locals()))
+ async def drag_and_drop(
+ self,
+ source: str,
+ target: str,
+ force: bool = None,
+ noWaitAfter: bool = None,
+ timeout: float = None,
+ trial: bool = None,
+ ) -> None:
+ return await self._main_frame.drag_and_drop(**locals_to_params(locals()))
+
async def select_option(
self,
selector: str,
diff --git a/playwright/async_api/_generated.py b/playwright/async_api/_generated.py
index c8d0b8f3e..295396e5d 100644
--- a/playwright/async_api/_generated.py
+++ b/playwright/async_api/_generated.py
@@ -3187,7 +3187,7 @@ async def is_checked(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3213,7 +3213,7 @@ async def is_disabled(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3239,7 +3239,7 @@ async def is_editable(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3265,7 +3265,7 @@ async def is_enabled(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3292,7 +3292,7 @@ async def is_hidden(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3319,7 +3319,7 @@ async def is_visible(self, selector: str, *, timeout: float = None) -> bool:
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
timeout : Union[float, NoneType]
Maximum time in milliseconds, defaults to 30 seconds, pass `0` to disable timeout. The default value can be changed by
@@ -3378,7 +3378,7 @@ async def dispatch_event(
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
type : str
DOM event type: `"click"`, `"dragstart"`, etc.
@@ -3659,7 +3659,7 @@ async def click(
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
modifiers : Union[List[Union["Alt", "Control", "Meta", "Shift"]], NoneType]
Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current
@@ -3739,7 +3739,7 @@ async def dblclick(
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
modifiers : Union[List[Union["Alt", "Control", "Meta", "Shift"]], NoneType]
Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current
@@ -3813,7 +3813,7 @@ async def tap(
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
modifiers : Union[List[Union["Alt", "Control", "Meta", "Shift"]], NoneType]
Modifier keys to press. Ensures that only these modifiers are pressed during the operation, and then restores current
@@ -3875,7 +3875,7 @@ async def fill(
Parameters
----------
selector : str
- A selector to search for element. If there are multiple elements satisfying the selector, the first will be used. See
+ A selector to search for an element. If there are multiple elements satisfying the selector, the first will be used. See
[working with selectors](./selectors.md) for more details.
value : str
Value to fill for the ``, `