如何选择前面的同级Xpath



我正在使用apache poi从Excel中读取值,然后将该值与UI进行比较。为了在UI中搜索记录,我输入了firstname和lastname,因为没有任何唯一的字段。对于某些记录,将获得多个记录作为搜索结果。然后我在DOB上进行第二次搜索。

//div[@class='grid-canvas']/div给我的是同名患者的总数。下面的代码显示了发现的4名患者。

<div class="ui-widget-content slick-row even" style="top:0px" xpath="1">
<div class="custom-tooltip slick-cell l0 r0 slick-cell-patient-search-checkboxsel">
<input type="checkbox"> </div>
<div class="custom-tooltip slick-cell l1 r1"> ANTRA </div>
<div class="custom-tooltip slick-cell l2 r2"> DAS </div>
<div class="custom-tooltip slick-cell l3 r3"> 12/18/1968 </div>
<div class="custom-tooltip slick-cell l4 r4"> 756663 </div>
<div class="custom-tooltip slick-cell l5 r5"></div>
<div class="custom-tooltip slick-cell l6 r6"></div>
<div class="custom-tooltip slick-cell l7 r7"></div>
<div class="custom-tooltip slick-cell l8 r8"></div>
<div class="custom-tooltip slick-cell l9 r9"></div>
</div>
<div class="ui-widget-content slick-row odd" style="top:50px" xpath="2">
<div class="custom-tooltip slick-cell l0 r0 slick-cell-patient-search-checkboxsel">
<input type="checkbox"> </div>
<div class="custom-tooltip slick-cell l1 r1"> ANTRA </div>
<div class="custom-tooltip slick-cell l2 r2"> DAS </div>
<div class="custom-tooltip slick-cell l3 r3"> 10/08/1988 </div>
<div class="custom-tooltip slick-cell l4 r4"> 755463 </div>
<div class="custom-tooltip slick-cell l5 r5"></div>
<div class="custom-tooltip slick-cell l6 r6"></div>
<div class="custom-tooltip slick-cell l7 r7"></div>
<div class="custom-tooltip slick-cell l8 r8"></div>
<div class="custom-tooltip slick-cell l9 r9"></div>
</div>
<div class="ui-widget-content slick-row even" style="top:100px" xpath="3"></div>
<div class="ui-widget-content slick-row odd" style="top:150px" xpath="4"></div>

名字为ANTRA DAS,如上所示找到了4条记录,我想为第2条记录打上一个勾号,因为DOB-10/08/1988与我从excel中读取的记录的DOB匹配。

我尝试使用以下代码,但没有成功。

@FindBy(xpath="//div[@class='grid-canvas']/div")
List<WebElement> patientList;  //Giving size 4.
@FindBy(xpath="//div[@class='grid-canvas']/div/div[4]")  
List<WebElement> patientsDOB; //Giving 4 DOB(div tags)
driver.findElement(By.xpath("//input[@id='txtSearchTextBox']")).sendKeys(Ex_FullName); //Reading fullname from Excel
driver.findElement(By.xpath("//input[@id='imgbtnSeach']")).click();
if(patientList.size() > 1)
{
for(int d=0; d<patientList.size(); d++)
{
String DOB = patientsDOB.get(d).getText();
DataFormatter formatter = new DataFormatter();
String Ex_DOB = formatter.formatCellValue(sheet.getRow(r).getCell(3));**//Reading from Excel**
if(DOB.equals(Ex_DOB))
{
WebElement tickOption = patientList.get(d).findElement(By.xpath("//div[1]/input"));
tickOption.click();
}
}
}
else {  
WebElement tickOption = driver.findElement(By.xpath("//body/div[@id='mainPageLayoutDiv']/div[2]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/form[1]/div[2]/div[1]/div[2]/div[1]/div[1]/span[1]/input[1]")); 
tickOption.click();
}

您可以使用单个定位器来完成此操作,但它将是一个大定位器。我将带你了解它是如何构建的,希望它能有一些意义。

这是完整的XPath

//div[contains(@class,'slick-row')][./div[contains(@class,'r1')][text()=' ANTRA ']][./div[contains(@class,'r2')][text()=' DAS ']][./div[contains(@class,'r3')][text()=' 10/08/1988 ']]/div/input

在高层,我们发现了一个包含多个具有特定需求的元素的父DIV。。。正确的两个名称和DOB。一旦我们找到DIV,就找到子DIV和子INPUT。以下是每个步骤的详细信息:

我将把它重新格式化为多行,这样我就可以分解它并更容易地解释它。

1 //div[contains(@class,'slick-row')]
2 [./div[contains(@class,'r1')][text()=' ANTRA ']]
3 [./div[contains(@class,'r2')][text()=' DAS ']]
4 [./div[contains(@class,'r3')][text()=' 10/08/1988 ']]
5 /div/input

第1部分是非常标准的,您可能已经理解了……它找到了一个包含类"光滑行"的DIV。这是表示患者及其信息的每个HTML块的父DIV。每个患者都有一个。我们需要添加更多的过滤器来找到合适的过滤器。

第2部分是从第1部分中获取潜在的父DIV,并找到一个具有子DIV的DIV,该子DIV具有类"r1",并且还包含文本"ANTRA"(注意文本周围的空格(。

第3部分和第4部分与第2部分相似…只需将过滤器添加到第1部分的DIV中,其中包含名称和DOB。

一旦我们找到了符合步骤2-4中所有过滤器的正确父DIV,我们就需要找到具有子INPUT的子DIV。这是需要点击的最后一个INPUT。

现在来看代码。您不再需要(至少对于此任务(patientListpatientsDOB,以便可以删除它们。

driver.findElement(By.xpath("//input[@id='txtSearchTextBox']")).sendKeys(Ex_FullName); // Reading fullname from Excel
driver.findElement(By.xpath("//input[@id='imgbtnSeach']")).click();
String firstName = " ANTRA "; // read from Excel?
String lastName = " DAS "; // read from Excel?
String DOB = patientsDOB.get(d).getText();
DataFormatter formatter = new DataFormatter();
String Ex_DOB = formatter.formatCellValue(sheet.getRow(r).getCell(3)); // read from Excel
driver.findElement(By.xpath("//div[contains(@class,'slick-row')][./div[contains(@class,'r1')][text()=' " + firstName + " ']][./div[contains(@class,'r2')][text()=' " + lastName + " ']][./div[contains(@class,'r3')][text()=' " + Ex_DOB + " ']]/div/input")).click();

我可能会把名字和姓氏倒过来,所以你可能需要切换变量名。

最新更新