如何使用 Selenium + Python 根据另一个元素中包含的文本单击正确的链接?

问题描述 投票:0回答:1

我有一个像这样的html结构

<tbody>
    <tr role="row" class="odd">
        <td class="text-center dtr-control"></td>
        <td class="text-center">
            <a href="#" class="px-2 text-dark" onclick="bookPatient('1351','')">
                <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i>
                <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i>
            </a>
        </td>
        <td>Dedeh</td>
        <td class="text-center">Female</td>
        <td class="text-center">07/02/1983</td>
        <td class style>PT MAJU JAYA</td>
    </tr>
    <tr role="row" class="odd">
        <td class="text-center dtr-control"></td>
        <td class="text-center">
            <a href="#" class="px-2 text-dark" onclick="bookPatient('1352','')">
                <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i>
                <i class="fa-solid fa-pen-to-square cursor-pointer fa-lg"></i>
            </a>
        </td>
        <td>Mira</td>
        <td class="text-center">Female</td>
        <td class="text-center">17/10/2002</td>
        <td class style>PT MAJU JAYA</td>
    </tr>
</tbody>

我期望 Selenium 在检查是否有相应的

<a>
值后单击
searched_text_bod
元素。当我尝试使用此代码时,输出始终无法识别
<a>
中的
<td>
元素。

该网站的元素上没有类或 ID,所以我遇到了困难。

searched_text_bod = "20/03/1990"

# Improved XPath targeting based on confirmed structure
base_xpath = "//tbody/tr[@role='row']"
patient_row_xpath = f"{base_xpath}/td[text()='{searched_text_bod}']"

try:
  # Find patient row containing the exact date of birth
  patient_link = WebDriverWait(driver, 10).until(
      EC.presence_of_element_located((By.XPATH, patient_row_xpath)))

  edit_patient_info = patient_link.find_element(By.XPATH,
                                                "/following-sibling::td/a")

  if patient_link:
    print(f"Found patient with date of birth: {searched_text_bod}")
    edit_patient_info.click(
    )  # Click on the 'a' element (assuming it's the link)

  else:
    print(
        f"Patient with date of birth '{searched_text_bod}' not found using DoB search"
    )
python selenium-webdriver xpath
1个回答
0
投票

当我需要创建一个有点复杂的自定义 XPath 时,我会经历一个过程,就像这个一样。我分步骤构建 XPath,验证每个步骤是否返回我想要的元素。我认为这比从头开始创建最终的 XPath,发现它不起作用,然后尝试排除故障更容易、更快。

目标是找到同时包含带有 DOB 的 TD 和我们要点击的 A 标签的 TR。这样我们就确保了 DOB 和链接位于同一表行中。

  1. 我做的第一件事就是找到包含 DOB 的 TD 元素

    //tr/td[text()='17/10/2002']
    

    考虑到您现有的 XPath,您似乎可以控制这一步。现在这就是开始变得棘手的地方。

  2. 重新排列 XPath,使其返回 TR 而不是 TD

    //tr[./td[text()='17/10/2002']]
    
  3. 现在我们只需要从TR中找到A即可

    //tr[./td[text()='17/10/2002']]/td/a
    

如果您还没有准备好,您想使用浏览器中的开发工具控制台来测试您的定位器。使用

$x()
作为 XPath,使用
$$()
作为 CSS 选择器。最终的 XPath 是

$x("//tr[./td[text()='17/10/2002']]/td/a")

有关 Chrome 开发工具的更多信息,请参阅文档

从这里,我们可以更新代码...

wait = WebDriverWait(driver, 10)
searched_text_dob = "17/10/2002"

links = wait.until(EC.visibility_of_all_elements_located((By.XPATH, f"//tr[./td[text()='{searched_text_dob}']]/td/a")))
if links:
    links[0].click()
else:
    print(f"Patient with date of birth '{searched_text_dob}' not found using DoB search")
© www.soinside.com 2019 - 2024. All rights reserved.