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

chore(roll): roll Playwright to 1.37.0-alpha-aug-8-2023 #2035

Merged
merged 3 commits into from
Aug 9, 2023
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H

| | Linux | macOS | Windows |
| :--- | :---: | :---: | :---: |
| Chromium <!-- GEN:chromium-version -->115.0.5790.75<!-- GEN:stop --> | ✅ | ✅ | ✅ |
| Chromium <!-- GEN:chromium-version -->116.0.5845.62<!-- GEN:stop --> | ✅ | ✅ | ✅ |
| WebKit <!-- GEN:webkit-version -->17.0<!-- GEN:stop --> | ✅ | ✅ | ✅ |
| Firefox <!-- GEN:firefox-version -->115.0<!-- GEN:stop --> | ✅ | ✅ | ✅ |

Expand Down
5 changes: 5 additions & 0 deletions playwright/_impl/_artifact.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,10 @@ async def failure(self) -> Optional[str]:
async def delete(self) -> None:
await self._channel.send("delete")

async def read_info_buffer(self) -> bytes:
stream = cast(Stream, from_channel(await self._channel.send("stream")))
buffer = await stream.read_all()
return buffer

async def cancel(self) -> None:
await self._channel.send("cancel")
18 changes: 14 additions & 4 deletions playwright/_impl/_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import base64
import json
from pathlib import Path
from types import SimpleNamespace
from typing import TYPE_CHECKING, Dict, List, Pattern, Union, cast
from typing import TYPE_CHECKING, Dict, List, Optional, Pattern, Union, cast

from playwright._impl._api_structures import (
Geolocation,
Expand All @@ -25,6 +24,7 @@
StorageState,
ViewportSize,
)
from playwright._impl._artifact import Artifact
from playwright._impl._browser_context import BrowserContext
from playwright._impl._cdp_session import CDPSession
from playwright._impl._connection import ChannelOwner, from_channel
Expand All @@ -39,6 +39,7 @@
async_readfile,
is_safe_close_error,
locals_to_params,
make_dirs_for_file,
prepare_record_har_options,
)
from playwright._impl._network import serialize_headers
Expand All @@ -61,6 +62,7 @@ def __init__(
self._is_connected = True
self._is_closed_or_closing = False
self._should_close_connection_on_close = False
self._cr_tracing_path: Optional[str] = None

self._contexts: List[BrowserContext] = []
self._channel.on("close", lambda _: self._on_close())
Expand Down Expand Up @@ -207,12 +209,20 @@ async def start_tracing(
if page:
params["page"] = page._channel
if path:
self._cr_tracing_path = str(path)
params["path"] = str(path)
await self._channel.send("startTracing", params)

async def stop_tracing(self) -> bytes:
encoded_binary = await self._channel.send("stopTracing")
return base64.b64decode(encoded_binary)
artifact = cast(Artifact, from_channel(await self._channel.send("stopTracing")))
buffer = await artifact.read_info_buffer()
await artifact.delete()
if self._cr_tracing_path:
make_dirs_for_file(self._cr_tracing_path)
with open(self._cr_tracing_path, "wb") as f:
f.write(buffer)
self._cr_tracing_path = None
return buffer


async def prepare_browser_context_params(params: Dict) -> None:
Expand Down
17 changes: 11 additions & 6 deletions playwright/_impl/_browser_type.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
from playwright._impl._connection import (
ChannelOwner,
Connection,
filter_none,
from_channel,
from_nullable_channel,
)
Expand Down Expand Up @@ -187,6 +188,7 @@ async def connect(
timeout: float = None,
slow_mo: float = None,
headers: Dict[str, str] = None,
expose_network: str = None,
) -> Browser:
if timeout is None:
timeout = 30000
Expand All @@ -198,12 +200,15 @@ async def connect(
pipe_channel = (
await local_utils._channel.send_return_as_dict(
"connect",
{
"wsEndpoint": ws_endpoint,
"headers": headers,
"slowMo": slow_mo,
"timeout": timeout,
},
filter_none(
{
"wsEndpoint": ws_endpoint,
"headers": headers,
"slowMo": slow_mo,
"timeout": timeout,
"exposeNetwork": expose_network,
}
),
)
)["pipe"]
transport = JsonPipeTransport(self._connection._loop, pipe_channel)
Expand Down
2 changes: 1 addition & 1 deletion playwright/_impl/_locator.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ def locator(
raise Error("Locators must belong to the same frame.")
return Locator(
self._frame,
f"{self._selector} >> {selector_or_locator._selector}",
f"{self._selector} >> internal:chain={json.dumps(selector_or_locator._selector)}",
has_text=has_text,
has_not_text=has_not_text,
has_not=has_not,
Expand Down
9 changes: 9 additions & 0 deletions playwright/_impl/_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,12 @@ async def save_as(self, path: Union[str, Path]) -> None:
None, lambda: file.write(base64.b64decode(binary))
)
await self._loop.run_in_executor(None, lambda: file.close())

async def read_all(self) -> bytes:
binary = b""
while True:
chunk = await self._channel.send("read", {"size": 1024 * 1024})
if not chunk:
break
binary += base64.b64decode(chunk)
return binary
48 changes: 37 additions & 11 deletions playwright/async_api/_generated.py
Original file line number Diff line number Diff line change
Expand Up @@ -4277,6 +4277,9 @@ async def set_content(
) -> None:
"""Frame.set_content

This method internally calls [document.write()](https://developer.mozilla.org/en-US/docs/Web/API/Document/write),
inheriting all its specific characteristics and behaviors.

Parameters
----------
html : str
Expand Down Expand Up @@ -9156,6 +9159,9 @@ async def set_content(
) -> None:
"""Page.set_content

This method internally calls [document.write()](https://developer.mozilla.org/en-US/docs/Web/API/Document/write),
inheriting all its specific characteristics and behaviors.

Parameters
----------
html : str
Expand Down Expand Up @@ -9854,7 +9860,7 @@ async def route_from_har(
"""Page.route_from_har

If specified the network requests that are made in the page will be served from the HAR file. Read more about
[Replaying from HAR](https://playwright.dev/python/docs/network#replaying-from-har).
[Replaying from HAR](https://playwright.dev/python/docs/mock#replaying-from-har).

Playwright will not serve requests intercepted by Service Worker from the HAR file. See
[this](https://github.com/microsoft/playwright/issues/1090) issue. We recommend disabling Service Workers when
Expand Down Expand Up @@ -13592,7 +13598,7 @@ async def route_from_har(
"""BrowserContext.route_from_har

If specified the network requests that are made in the context will be served from the HAR file. Read more about
[Replaying from HAR](https://playwright.dev/python/docs/network#replaying-from-har).
[Replaying from HAR](https://playwright.dev/python/docs/mock#replaying-from-har).

Playwright will not serve requests intercepted by Service Worker from the HAR file. See
[this](https://github.com/microsoft/playwright/issues/1090) issue. We recommend disabling Service Workers when
Expand Down Expand Up @@ -14088,7 +14094,7 @@ async def new_context(
is_mobile : Union[bool, None]
Whether the `meta viewport` tag is taken into account and touch events are enabled. isMobile is a part of device,
so you don't actually need to set it manually. Defaults to `false` and is not supported in Firefox. Learn more
about [mobile emulation](../emulation.md#isMobile).
about [mobile emulation](../emulation.md#ismobile).
has_touch : Union[bool, None]
Specifies if viewport supports touch events. Defaults to false. Learn more about
[mobile emulation](../emulation.md#devices).
Expand Down Expand Up @@ -14302,7 +14308,7 @@ async def new_page(
is_mobile : Union[bool, None]
Whether the `meta viewport` tag is taken into account and touch events are enabled. isMobile is a part of device,
so you don't actually need to set it manually. Defaults to `false` and is not supported in Firefox. Learn more
about [mobile emulation](../emulation.md#isMobile).
about [mobile emulation](../emulation.md#ismobile).
has_touch : Union[bool, None]
Specifies if viewport supports touch events. Defaults to false. Learn more about
[mobile emulation](../emulation.md#devices).
Expand Down Expand Up @@ -14847,7 +14853,7 @@ async def launch_persistent_context(
is_mobile : Union[bool, None]
Whether the `meta viewport` tag is taken into account and touch events are enabled. isMobile is a part of device,
so you don't actually need to set it manually. Defaults to `false` and is not supported in Firefox. Learn more
about [mobile emulation](../emulation.md#isMobile).
about [mobile emulation](../emulation.md#ismobile).
has_touch : Union[bool, None]
Specifies if viewport supports touch events. Defaults to false. Learn more about
[mobile emulation](../emulation.md#devices).
Expand Down Expand Up @@ -15033,7 +15039,8 @@ async def connect(
*,
timeout: typing.Optional[float] = None,
slow_mo: typing.Optional[float] = None,
headers: typing.Optional[typing.Dict[str, str]] = None
headers: typing.Optional[typing.Dict[str, str]] = None,
expose_network: typing.Optional[str] = None
) -> "Browser":
"""BrowserType.connect

Expand All @@ -15052,6 +15059,20 @@ async def connect(
on. Defaults to 0.
headers : Union[Dict[str, str], None]
Additional HTTP headers to be sent with web socket connect request. Optional.
expose_network : Union[str, None]
This option exposes network available on the connecting client to the browser being connected to. Consists of a
list of rules separated by comma.

Available rules:
1. Hostname pattern, for example: `example.com`, `*.org:99`, `x.*.y.com`, `*foo.org`.
1. IP literal, for example: `127.0.0.1`, `0.0.0.0:99`, `[::1]`, `[0:0::1]:99`.
1. `<loopback>` that matches local loopback interfaces: `localhost`, `*.localhost`, `127.0.0.1`, `[::1]`.

Some common examples:
1. `"*"` to expose all network.
1. `"<loopback>"` to expose localhost network.
1. `"*.test.internal-domain,*.staging.internal-domain,<loopback>"` to expose test/staging deployments and
localhost.

Returns
-------
Expand All @@ -15064,6 +15085,7 @@ async def connect(
timeout=timeout,
slow_mo=slow_mo,
headers=mapping.to_impl(headers),
expose_network=expose_network,
)
)

Expand Down Expand Up @@ -16833,7 +16855,8 @@ async def blur(self, *, timeout: typing.Optional[float] = None) -> None:
async def all(self) -> typing.List["Locator"]:
"""Locator.all

When locator points to a list of elements, returns array of locators, pointing to respective elements.
When the locator points to a list of elements, this returns an array of locators, pointing to their respective
elements.

**NOTE** `locator.all()` does not wait for elements to match the locator, and instead immediately returns
whatever is present in the page. When the list of elements changes dynamically, `locator.all()` will
Expand Down Expand Up @@ -17803,6 +17826,9 @@ async def type(
) -> None:
"""Locator.type

**NOTE** In most cases, you should use `locator.fill()` instead. You only need to type characters if there
is special keyboard handling on the page.

Focuses the element, and then sends a `keydown`, `keypress`/`input`, and `keyup` event for each character in the
text.

Expand Down Expand Up @@ -19908,16 +19934,16 @@ async def to_have_text(
from playwright.sync_api import expect

# ✓ Has the right items in the right order
await expect(page.locator(\"ul > li\")).to_have_text([\"Text 1\", \"Text 2\", \"Text 3\"])
expect(page.locator(\"ul > li\")).to_have_text([\"Text 1\", \"Text 2\", \"Text 3\"])

# ✖ Wrong order
await expect(page.locator(\"ul > li\")).to_have_text([\"Text 3\", \"Text 2\", \"Text 1\"])
expect(page.locator(\"ul > li\")).to_have_text([\"Text 3\", \"Text 2\", \"Text 1\"])

# ✖ Last item does not match
await expect(page.locator(\"ul > li\")).to_have_text([\"Text 1\", \"Text 2\", \"Text\"])
expect(page.locator(\"ul > li\")).to_have_text([\"Text 1\", \"Text 2\", \"Text\"])

# ✖ Locator points to the outer list element, not to the list items
await expect(page.locator(\"ul\")).to_have_text([\"Text 1\", \"Text 2\", \"Text 3\"])
expect(page.locator(\"ul\")).to_have_text([\"Text 1\", \"Text 2\", \"Text 3\"])
```

Parameters
Expand Down
Loading
Loading