{} 中元素的 XPATH 语法,Selenium for Python

XPATH syntax for element in {} with Selenium for Python

我目前正在尝试在 Python 中使用 Selenium 单击网页上的每个按钮,每个按钮的 class 和文本始终相同,但每个按钮都有不同的 ID。然而,这些 ID 在 {} 的“数据参数”中,我无法弄清楚如何获得 xpath 的正确语法。 以下是其中一个按钮的网站片段:

<span class="contains-icon-details gc-btn gc-btn--s" data-isneededpromise="false" data-parameters="{"partner":"gs", "realId": "8da1d6a9-44d1-4556-bc12-92699749a30a", "tnId": "102086182829", "type": "details"}">More Details</span>

似乎 realId 和 tnId 是唯一的,所以我需要找到其中之一的按钮。

这个有效:

driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']").click()

但当然只针对第一个按钮,因为 class 始终相同。

我试过这样的事情:

driver.find_element_by_xpath("//*[contains(@tnId, '102086182829')]").click()

但我明白了

Unable to locate element: //*[contains(@tnId, '102086182829')]

所以绝对不是正确的语法。

我试图在网上找到解决方案,但到目前为止还没有成功。谁能指出我正确的方向?提前致谢。

如果 realId 值或 tnId 值是唯一的,您的 XPath 可以是

driver.find_element_by_xpath("//*[contains(@data-parameters, '8da1d6a9-44d1-4556-bc12-92699749a30a')]").click()

driver.find_element_by_xpath("//*[contains(@data-parameters, '102086182829)]").click()

您应该按“数据参数”属性进行过滤。

尝试

driver.find_element_by_xpath("//span[contains(@data-parameters, '102086182829')]").click()

这是您所需要的肮脏实现。最好提取数据参数字段,反序列化 JSON 并检查所需的字段;

spans = driver.find_element_by_xpath("//span[@class='contains-icon-details gc-btn gc-btn--s']")
for span in spans:
    data_parameters = span.get_attribute("data-parameters")
    try:
        data_parameters = json.loads(data_parameters)
    except:
        continue

    if 'tnId' in data_parameters and data_parameters['tnId'] == "102086182829":
        span.click()
        break