如何使用 Python 和 Playwright 实现控件查找及定位的。下面我们简单了解一下。


1. 安装 Playwright

首先确保你已经安装了 Playwright 的 Python 版本:

pip install playwright

安装浏览器驱动:

playwright install

2. 基础定位方法

Playwright 提供了多种方法来定位页面上的元素。以下是常用的定位方式及实现代码:

2.1 CSS 选择器

通过标准的 CSS 选择器查找元素:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    
    page.goto("https://example.com")
    
    # 定位按钮并点击
    button = page.locator("button.my-class")
    button.click()
    
    browser.close()

支持所有 CSS 选择器,常见用法包括:

  • 按类名:page.locator(".class-name")
  • 按 ID:page.locator("#id-name")
  • 按标签:page.locator("div")
  • 层级选择器:page.locator("div > span")

2.2 文本定位

按元素的文本内容查找:

# 精确匹配文本
button = page.locator("text=Learn more")
button.click()

# 模糊匹配(正则表达式)
partial_text = page.locator("text=/Partial Text/i")
partial_text.click()

2.3 Role(角色)定位

Playwright 支持基于 ARIA 无障碍属性的角色定位:

# 查找按钮
button = page.get_by_role("button", name="Submit")
button.click()

# 查找输入框
textbox = page.get_by_role("textbox", name="Search")
textbox.fill("Playwright Python")

常见角色:

  • button: 按钮
  • link: 链接
  • textbox: 输入框
  • checkbox: 复选框

2.4 XPath 定位

通过 XPath 表达式定位元素:

# 使用 XPath 定位元素
element = page.locator("//div[@id='example']")
element.click()

2.5 测试 ID 定位

如果页面元素带有 data-testid 属性,可以直接通过 get_by_test_id 定位:

# 使用 data-testid 定位
test_id_element = page.get_by_test_id("submit-button")
test_id_element.click()

2.6 相对定位

支持基于父子、兄弟等关系定位元素:

# 父子定位
child_element = page.locator("div.parent-class >> span.child-class")

# 兄弟定位
sibling_element = page.locator("div.sibling-class >> nth=1")

3. 高级定位功能

3.1 多重过滤

结合多个条件筛选元素:

# 查找带有特定文本的按钮
button = page.locator("button.my-class", has_text="Submit")
button.click()

3.2 索引定位

在多个相似元素中,通过索引定位特定的元素:

# 定位第二个按钮
second_button = page.locator("button").nth(1)
second_button.click()

3.3 自动等待动态加载的元素

Playwright 会自动等待元素加载完成后再进行操作。如果需要显式等待:

# 等待元素出现
page.wait_for_selector("button.dynamic-button")

或者使用 locator.wait_for():

dynamic_button = page.locator("button.dynamic-button")
dynamic_button.wait_for()
dynamic_button.click()

4. 常见操作

4.1 等待元素可见

确保元素已经加载并可见后再操作:

button = page.locator("button")
button.wait_for(state="visible")
button.click()

4.2 检查元素状态

检查元素是否可见、启用、已选中等:

button = page.locator("button")

# 检查是否可见
is_visible = button.is_visible()
print(f"Button visible: {is_visible}")

# 检查是否可用
is_enabled = button.is_enabled()
print(f"Button enabled: {is_enabled}")

5. 完整示例代码

以下是一个完整的示例代码,展示如何使用 Playwright 进行控件查找和操作:

from playwright.sync_api import sync_playwright

def run(playwright):
    browser = playwright.chromium.launch(headless=False)
    page = browser.new_page()

    # 打开页面
    page.goto("https://example.com")

    # 定位并点击按钮
    button = page.locator("button#submit")
    button.click()

    # 等待新页面加载
    page.wait_for_selector(".result")

    # 获取结果文本
    result_text = page.locator(".result").text_content()
    print(f"Result: {result_text}")

    # 关闭浏览器
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

6. 调试与工具

  1. Playwright Inspector
    在调试过程中,可以使用 Playwright Inspector 工具查看元素:

    python -m playwright codegen https://example.com
    
  2. 打印选择器结果
    在代码中打印定位器是否找到了元素:

    button = page.locator("button#submit")
    print(f"Button found: {button.count() > 0}")
    
  3. 浏览器开发者工具
    在浏览器中通过 F12 打开开发者工具,使用 CSS/XPath 选择器验证定位。


7. 最佳实践

  • 优先使用唯一标识符:推荐使用 data-testid 或唯一的 ID。
  • 避免依赖文本:文本可能会因翻译或内容修改而变化。
  • 调试选择器:使用 Playwright Inspector 或开发者工具验证选择器的准确性。
  • 自动等待:充分利用 Playwright 的自动等待机制,减少显式等待的使用。

通过上面的指南,你可以使用 Playwright 的 Python 库高效地实现页面控件查找及操作。Playwright 的强大定位功能和自动等待机制可以显著提高测试的稳定性和效率。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐