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

如何使用Selenium为RPA Challenge电影卡片图片找有效定位器?

问题:RPA Challenge电影搜索结果定位与数据保存问题

问题描述

我正在编写Robot Framework代码访问rpachallenge.com,切换到「Movie Search」标签页搜索电影,需要把搜索结果里三部电影的卡片图片、标题及描述保存到JSON文件。目前搜索步骤已完成,但找不到标题卡片的有效定位器。

查看页面代码后发现三部电影结构完全一致,仅图片链接、标题等内容不同。尝试用class='card-image'定位图片时,出现错误:

WebDriverException: ... {"code":-32000,"message":"Cannot take screenshot with 0 height."}

排查后发现是因为存在多个同名class元素导致的。我是Selenium新手,不知道怎么用相关关键字解决问题,以下是我的代码(包含尝试过的注释代码):

*** Settings ***
Documentation     Searches for given movie on RPA Challenge site 
...               and saves resulting data in JSON.

Library           OperatingSystem
Library           RPA.Browser.Selenium

Suite Teardown    Close All Browsers


*** Variables ***
${RPA_Challenge_URL}     https://rpachallenge.com
${img_URL}     http://image.tmdb.org
${movie}     Dune


*** Keywords ***
Open RPA Challenge Page
    ${use_chrome} =     Get Environment Variable     USE_CHROME     ${EMPTY}
    IF    "${use_chrome}" != ""
        Open Available Browser    ${RPA_Challenge_URL}    browser_selection=Chrome
        ...    download=${True}  # forces Chrome and matching webdriver download
    ELSE
        Open Available Browser    ${RPA_Challenge_URL}  # opens any available browser
    END   

Switch to Movie Search Tab
    Click Link     xpath://a[text()='Movie Search']

Search for Given Movie
    Input Text     name:searchStr     ${movie}
    Press Keys    name:searchStr    ENTER
    Wait Until Page Contains Element     css:div[class='card-image']

# WebDriverException: ... {"code":-32000,"message":"Cannot take screenshot with 0 height."}
Save Movie Card Image
    # Assign ID to Element  //ul[@class='card-image' and ./li[contains(., '_ngcontent-c3')]]    movie_cover
    Capture Element Screenshot     css:div[class='card-image']
    # Capture Element Screenshot     xpath://a[contains(text(), 'image.tmdb.org'.)]
    # Capture Element Screenshot     xpath://a[tag:img]
    # Capture Element Screenshot     css:div[class='card-image' and contains(text(), 'image')]    # invalid

# Element with locator 'css:div[class='card-title-activator']' not found.
Save Movie Title
    Capture Element Screenshot     css:div[class='card-title-activator']

# Return JSON
    # print(driver.find_element_by_xpath("//div[@id='json']").text)
    # Does the above need to go in a .py file?

*** Tasks ***
Return movie information from RPA Challenge site
    TRY
        Open RPA Challenge Page
        Switch to Movie Search Tab
        Search for Given Movie
        # Save Movie Title
        Save Movie Card Image
    EXCEPT
        ${err_ss} =    Set Variable    ${OUTPUT_DIR}${/}error.png
        Capture Page Screenshot     ${err_ss}
        Fail    Checkout the screenshot: ${err_ss}
    END

解决方案

1. 先定位所有电影卡片容器

页面中每个电影的卡片父容器是div.card,先获取所有卡片的列表,避免直接定位重复class元素:

${movie_cards}=    Get WebElements    css:div.card

2. 遍历卡片提取单部电影数据

对每个卡片,精准定位内部的图片、标题、描述,避免全局定位冲突:

Process Movie Cards
    ${movie_cards}=    Get WebElements    css:div.card
    ${movie_data}=    Create List
    :FOR    ${card}    IN    @{movie_cards}
    \    # 提取图片URL并截图
    \    ${img_element}=    Get WebElement    ${card}    css:div.card-image img
    \    ${img_src}=    Get Element Attribute    ${img_element}    src
    \    ${img_filename}=    Set Variable    ${OUTPUT_DIR}${/}movie_${title}.png
    \    Capture Element Screenshot    ${img_element}    ${img_filename}
    \    # 提取标题
    \    ${title}=    Get Text    ${card}    css:div.card-title-activator
    \    # 提取描述
    \    ${desc}=    Get Text    ${card}    css:div.card-content p
    \    # 组装单部电影数据
    \    ${movie_info}=    Create Dictionary    image=${img_src}    title=${title}    description=${desc}
    \    Append To List    ${movie_data}    ${movie_info}
    # 保存所有数据到JSON文件
    ${json_path}=    Set Variable    ${OUTPUT_DIR}${/}movie_results.json
    Convert To Json    ${movie_data}    ${json_path}    pretty_print=${True}

3. 直接获取页面原始JSON数据

不需要额外写Python代码,用Robot Framework关键字即可获取页面的JSON文本:

Get Page Raw JSON
    ${json_text}=    Get Text    id=json
    ${json_path}=    Set Variable    ${OUTPUT_DIR}${/}page_raw.json
    Create File    ${json_path}    ${json_text}

4. 更新任务流程

替换原任务中的无效关键字,使用新的处理逻辑:

*** Tasks ***
Return movie information from RPA Challenge site
    TRY
        Open RPA Challenge Page
        Switch to Movie Search Tab
        Search for Given Movie
        Process Movie Cards
        Get Page Raw JSON
    EXCEPT
        ${err_ss} =    Set Variable    ${OUTPUT_DIR}${/}error.png
        Capture Page Screenshot     ${err_ss}
        Fail    查看错误截图:${err_ss}
    END

内容的提问来源于stack exchange,提问作者msb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:52:49