You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright Python中如何在evaluate的JavaScript里使用定位器

如何在Playwright的evaluate中使用已定义的定位器获取下拉框选中项文本?

我现在有一段Playwright测试脚本,通过JavaScript提取下拉框选中项的文本,但想把之前定义的定位器(比如get_by_role("combobox"))复用在evaluate的JS代码里,而不是重复写DOM选择器。

当前脚本:

def test_combobox_selected_by_label(page):
    page.goto("http://www.tizag.com/htmlT/htmlselect.php")
    element = page.get_by_role("combobox")
    element.select_option("Colorado -- CO")
    # 这里重复用了DOM选择器,想换成已定义的element定位器
    selected_label = page.evaluate("document.getElementsByName('selectionField')[0].options[document.getElementsByName('selectionField')[0].selectedIndex].text")
    assert selected_label == "Colorado -- CO"

可用的定位器有两个:

  • page.get_by_role("combobox")
  • page.locator("[name=selectionField]").first

需要改写代码,让evaluate里能直接使用这些预定义的定位器变量。


解决方案:将定位器对应的元素作为参数传入evaluate

Playwright的evaluate方法支持传入参数,你可以直接调用定位器的evaluate方法(或先获取元素句柄传入page.evaluate),这样JS代码里就能直接操作预定位好的元素,无需重复编写DOM选择器。

方法1:使用get_by_role("combobox")定位器

def test_combobox_selected_by_label(page):
    page.goto("http://www.tizag.com/htmlT/htmlselect.php")
    element = page.get_by_role("combobox")
    element.select_option("Colorado -- CO")
    # 直接调用定位器的evaluate,JS参数即为该定位器对应的DOM元素
    selected_label = element.evaluate("(selectElement) => selectElement.options[selectElement.selectedIndex].text")
    assert selected_label == "Colorado -- CO"

方法2:使用page.locator("[name=selectionField]").first定位器

def test_combobox_selected_by_label(page):
    page.goto("http://www.tizag.com/htmlT/htmlselect.php")
    element = page.locator("[name=selectionField]").first
    element.select_option("Colorado -- CO")
    selected_label = element.evaluate("(selectElement) => selectElement.options[selectElement.selectedIndex].text")
    assert selected_label == "Colorado -- CO"

补充:基于page.evaluate的写法

如果更倾向于使用page.evaluate,可以先获取元素句柄再传入:

def test_combobox_selected_by_label(page):
    page.goto("http://www.tizag.com/htmlT/htmlselect.php")
    element = page.get_by_role("combobox")
    element.select_option("Colorado -- CO")
    # 获取元素句柄
    element_handle = element.first
    # 将元素句柄作为参数传入page.evaluate
    selected_label = page.evaluate("(selectElement) => selectElement.options[selectElement.selectedIndex].text", element_handle)
    assert selected_label == "Colorado -- CO"

内容的提问来源于stack exchange,提问作者M András

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:20:11