Selenium - 如何在页面中以多种形式查找相同元素
Selenium - How to find same elements in multiple forms in page
我有一个页面,其中有多个表单并且所有表单都具有相同类型的字段。我需要找到 "Detection Date" 的所有值并将其与输入进行比较。
我的问题是如何从所有检测日期元素中获取日期时间?一个页面可能有 5-6 个检测日期值
我试过了但是没用
List<WebElement> list = driver.findElements(By.xpath("//td[contains(@class, 'CellHeaderRight') and text()='Detection Date']"));
System.out.println("Number of Date Fields " + list.size());
它给了我 0
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(1); return false;"
action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 10:56:31 PM</td>
.....
</tr>
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(2); return false;" action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 10:55:02 PM</td>
这是额外的HTML
<div id="idDivSearchResults" class="" style="display: block;">
table width="100%" cellspacing="0" cellpadding="5" border="0">
<tbody>
<tr>
<td>
<div style="border-width:1px; border-style:inset; background- color:#d0d0d0; padding:10px;">
<table width="100%" cellspacing="0" cellpadding="5" border="0">
<tbody>
<tr>
<td>
<b>Event Details</b>
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(0); return false;" action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Plate Number:</td>
<td>
</tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 11:59:59 PM</td>
</tr>
您提供的 XPath 表达式将匹配带有 Detection Date:
文本的 td
元素,而您需要下一个 td
元素。使用 following-sibling
:
//td[contains(@class, 'CellHeaderRight') and .='Detection Date:']/following-sibling::td[1]
请注意 Detection Date
之后还缺少一个 :
。
您还可以检查以 Detection Date
:
开头的文本
//td[contains(@class, 'CellHeaderRight') and starts-with(., 'Detection Date')]/following-sibling::td[1]
此外,在搜索检测日期之前,您可能需要明确等待 表格出现:
WebDriverWait wait = new WebDriverWait(webDriver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("idFrmUpdatePlateNumber")));
// find dates
如果搜索结果在iframe
里面,需要先切换到:
driver.switchTo.frame("Frame_ID_or_Name");
// find dates
如果你想获取<td>1/20/2015 10:55:02 PM</td>
这样的元素,如果它总是tr的第二个child,那么你可以使用xpath:
*//tr[td[text()="Detection Date:"]]/td[2]
这将找到包含带有检测日期文本的 td 元素的 tr 元素,并获取该 tr 元素的第二个元素。
另外,这个 website 是测试 xpath 和 css 选择器的非常有用的资源。
我有一个页面,其中有多个表单并且所有表单都具有相同类型的字段。我需要找到 "Detection Date" 的所有值并将其与输入进行比较。 我的问题是如何从所有检测日期元素中获取日期时间?一个页面可能有 5-6 个检测日期值
我试过了但是没用
List<WebElement> list = driver.findElements(By.xpath("//td[contains(@class, 'CellHeaderRight') and text()='Detection Date']"));
System.out.println("Number of Date Fields " + list.size());
它给了我 0
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(1); return false;"
action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 10:56:31 PM</td>
.....
</tr>
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(2); return false;" action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 10:55:02 PM</td>
这是额外的HTML
<div id="idDivSearchResults" class="" style="display: block;">
table width="100%" cellspacing="0" cellpadding="5" border="0">
<tbody>
<tr>
<td>
<div style="border-width:1px; border-style:inset; background- color:#d0d0d0; padding:10px;">
<table width="100%" cellspacing="0" cellpadding="5" border="0">
<tbody>
<tr>
<td>
<b>Event Details</b>
<form id="idFrmUpdatePlateNumber" onsubmit="UpdatePlateNumber(0); return false;" action="" method="post" ,="" name="frmUpdatePlateNumber">
<table width="100%" cellspacing="0" cellpadding="3" border="1" style="background-color:#f9f9f9;">
<tbody>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Plate Number:</td>
<td>
</tr>
<tr>
<tr>
<td class="CellHeaderRight" width="1%" nowrap="nowrap">Detection Date:</td>
<td>1/20/2015 11:59:59 PM</td>
</tr>
您提供的 XPath 表达式将匹配带有 Detection Date:
文本的 td
元素,而您需要下一个 td
元素。使用 following-sibling
:
//td[contains(@class, 'CellHeaderRight') and .='Detection Date:']/following-sibling::td[1]
请注意 Detection Date
之后还缺少一个 :
。
您还可以检查以 Detection Date
:
//td[contains(@class, 'CellHeaderRight') and starts-with(., 'Detection Date')]/following-sibling::td[1]
此外,在搜索检测日期之前,您可能需要明确等待 表格出现:
WebDriverWait wait = new WebDriverWait(webDriver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("idFrmUpdatePlateNumber")));
// find dates
如果搜索结果在iframe
里面,需要先切换到:
driver.switchTo.frame("Frame_ID_or_Name");
// find dates
如果你想获取<td>1/20/2015 10:55:02 PM</td>
这样的元素,如果它总是tr的第二个child,那么你可以使用xpath:
*//tr[td[text()="Detection Date:"]]/td[2]
这将找到包含带有检测日期文本的 td 元素的 tr 元素,并获取该 tr 元素的第二个元素。
另外,这个 website 是测试 xpath 和 css 选择器的非常有用的资源。