Add `include_shadow=` argument to `Get Page Source`

未关闭
#5,502 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
3/5
预计耗时
1-2 天
新手友好度
78/100
Issue 类型
功能
描述清晰度
描述清楚
活跃度
活跃
技术栈
playwright, python, typescript

调研方向

Read Browser/keywords/getters.py and trace Get Page Source through protobuf/playwright.proto, node/playwright-wrapper/grpc-service.ts, and node/playwright-wrapper/getters.ts. Add the named include_shadow option with a default of False, and check that it reaches Playwright's page.content() call. Add coverage in atest/test/02_Content_Keywords/basic_getters.robot and a focused wrapper test; done means open shadow content appears only when enabled and existing output stays unchanged by default.

由索引模型根据 Issue 内容生成。

描述

Use case

Get Page Source returns the page HTML from page.content(). Elements inside a shadow root are not in it: a web component appears as an empty host element. For pages built from web components (Lit, Stencil, Shoelace, Salesforce Lightning and similar) the page source is then nearly empty, so asserting on it, or saving it to debug a failure, shows little.

Playwright 1.64 added includeShadow to page.content(). With it, open shadow roots are written as declarative shadow DOM, <template shadowrootmode="open"> inside the host element. Closed shadow roots are never included.

Proposed keyword / arguments

Get Page Source assertion_operator=None assertion_expected=None message=None * include_shadow=False

  • include_shadow: named-only, defaults to False. When True, the content of open shadow roots is included as <template shadowrootmode="open"> elements inside their hosts. Closed shadow roots are never included.
*** Test Cases ***
Page Source Shows Web Component Content
    New Page    ${WEB_COMPONENT_URL}
    Get Page Source    not contains    Inside Shadow DOM
    Get Page Source    contains    <template shadowrootmode="open">    include_shadow=True
    Get Page Source    contains    Inside Shadow DOM    include_shadow=True

Playwright API

Checked with Playwright 1.65.0 and Chromium: an open root comes out as <div id="host"><template shadowrootmode="open"><b>in shadow</b></template></div>, a closed root as an empty <div id="closed"></div>, and without the option the open host is empty too.

Implementation notes

All references are to upstream main (5e350998).

  • protobuf/playwright.proto:596: rpc GetPageSource(Request.Empty) becomes rpc GetPageSource(Request.Bool). Request.Bool (:421-423) already exists and is used for similar single flags (SetOffline, GetConsoleLog). Still one Playwright call per rpc.
  • node/playwright-wrapper/grpc-service.ts:296-305 getPageSource: take pb.Request_Bool and pass request.value on.
  • node/playwright-wrapper/getters.ts:380-381 getPageSource(page): add the flag and call page.content({ includeShadow }). The chunking that follows (:383-394) stays as is.
  • Browser/keywords/getters.py:189-227 get_page_source: add *, include_shadow: bool = False after message, send Request().Bool(value=include_shadow) at :215, and document the argument, including that closed shadow roots are never included. The docstring also points to Get Property outerHTML for one element (:206-209); that does not include shadow content, which is worth one sentence.
  • Tests: atest/test/02_Content_Keywords/basic_getters.robot:181-182 has the plain Get Page Source case. Add one against node/dynamic-test-app/static/webcomponent.html, which attaches an open shadow root with the heading "Inside Shadow DOM" (:24-30): that text is missing by default and present with include_shadow=True. There is no Jest test for getPageSource in node/playwright-wrapper/__tests__/ today; a small one that mocks page.content and checks the option is passed is enough.

Backwards compatibility

Additive, named-only argument with a default that keeps today's output. The proto request type changes, but the rpc is internal to the library.

主要语言
Python
星标
662
派生
149
平均合并
6 小时 13 分钟
30 天内合并 PR
121

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

MarketSquare/robotframework-browser 的其他 Issue

查看 MarketSquare/robotframework-browser 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。