在 Python 的 Playwright 中,如何从框架 (iframe) 中检索元素的句柄?

Posted

技术标签:

【中文标题】在 Python 的 Playwright 中,如何从框架 (iframe) 中检索元素的句柄?【英文标题】:In Playwright for Python, how do I retrieve a handle for elements from within an frame (iframe)? 【发布时间】:2021-04-02 01:36:29 【问题描述】:

我已经成功地在 python 中使用 Playwright 从页面中获取元素。我现在遇到了从嵌入iframe 的文档中获取元素的挑战。例如,我使用了the w3schools page explaining the <option> element,它将结果显示在 iframe 中。我正在尝试从 iframe 中检索此 <option> 元素的句柄。

使用page.querySelector() 在页面上获取元素的“正常”方式无法获取elementHandle,这只会打印<class 'NoneType'>

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
        element = page.querySelector('select')
        print(type(element))
        browser.close()

我尝试先明确获取 iframe 的句柄,但这会产生相同的结果 (<class 'NoneType'>):

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')      
        iframe = page.querySelector('iframe')
        element = iframe.querySelector('select')
        print(type(element))
        browser.close()

如何从 iframe 中获取内容?

【问题讨论】:

【参考方案1】:

原来我很接近,但要正确获取 iframe,我需要调用 contentFrame() 方法。

返回引用 iframe 节点的元素句柄的内容框架,否则返回 null

然后,querySelector() 将返回各自的elementHandle 就好了:

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_option')
        iframe = page.querySelector('iframe').contentFrame()
        element = iframe.querySelector('select')
        print(type(element))
        print(element.innerHTML())
        browser.close()

成功打印

<class 'playwright.sync_api.ElementHandle'>

  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>

注意:如果有多个 iframe,您可以在检索句柄时只使用一个属性。在上面的示例中,通过其id 获取 iframe,例如使用

iframe = page.querySelector('iframe[id=\"iframeResult\"]').contentFrame()

【讨论】:

哦,你明白了:) 是的,不过还是谢谢。立即学习剧作家并获得很多乐趣... ;)【参考方案2】:

querySelector 将返回一个ElementHandle。在这种情况下,它将是iFrame,但作为一个页面元素。如果您想从该元素获取frame,您需要调用contentFrame,然后从那里处理该框架。

iframe = page.querySelector('#iframeResult').contentFrame()
element = iframe.querySelector('select')
print(type(element))

【讨论】:

以上是关于在 Python 的 Playwright 中,如何从框架 (iframe) 中检索元素的句柄?的主要内容,如果未能解决你的问题,请参考以下文章

python+playwright 学习-10.pytest-playwright插件编写测试用例

如何使用 playwright-python 处理多个页面?

在 Python 的 Playwright 中,我如何获取与 ElementHandle 相关的元素(孩子、父母、祖父母、兄弟姐妹)?

Python Playwright 基本使用(步骤详细)

python+playwright 学习-4.操作iframe

如何使用 PlayWright (python) 下载嵌入式 PDF?