我有一个像这样的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"
)
当我需要创建一个有点复杂的自定义 XPath 时,我会经历一个过程,就像这个一样。我分步骤构建 XPath,验证每个步骤是否返回我想要的元素。我认为这比从头开始创建最终的 XPath,发现它不起作用,然后尝试排除故障更容易、更快。
目标是找到同时包含带有 DOB 的 TD 和我们要点击的 A 标签的 TR。这样我们就确保了 DOB 和链接位于同一表行中。
我做的第一件事就是找到包含 DOB 的 TD 元素
//tr/td[text()='17/10/2002']
考虑到您现有的 XPath,您似乎可以控制这一步。现在这就是开始变得棘手的地方。
重新排列 XPath,使其返回 TR 而不是 TD
//tr[./td[text()='17/10/2002']]
现在我们只需要从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")