Java 如何选择前面的同级Xpath

Java 如何选择前面的同级Xpath,java,selenium-webdriver,Java,Selenium Webdriver,我使用ApachePOI从Excel中读取值,然后将该值与UI进行比较。 为了在UI中搜索记录,我输入firstname和lastname,因为它们没有任何唯一字段。对于某些记录,获取多个记录作为搜索结果。然后在DOB上进行第二次搜索 //div[@class='grid-canvas']/div给出了同名患者的总数。下面的代码显示了找到的4名患者 <div class="ui-widget-content slick-row even" style="top

我使用ApachePOI从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>

安特拉
达斯
12/18/1968 
756663
安特拉
达斯
10/08/1988 
755463
如上图所示,名称为ANTRA DAS found 4记录,我想为记录2打勾,因为1988年8月10日的DOB与我从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();
}
@FindBy(xpath=“//div[@class='grid-canvas']]/div”)
病人名单//给4号。
@FindBy(xpath=“//div[@class='grid-canvas']]/div/div[4]”)
列出病人名单//给出4个DOB(div标签)
findElement(By.xpath(“//input[@id='txtSearchTextBox'])).sendKeys(Ex_FullName)//从Excel读取全名
findElement(By.xpath(//input[@id='imgbtnSeach']))。单击();
如果(patientList.size()>1)
{

对于(intd=0;d你可以用一个定位器来实现,但它将是一个很大的定位器。我将带你了解它是如何构造的,希望它有一定的意义

这是完整的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和子输入。以下是每个步骤的详细信息:

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

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部分是相当标准的,您可能理解它…它找到了一个包含类“slick row”的DIV。这是表示患者及其信息的每个HTML块的父DIV。每个患者都有一个。我们需要添加更多筛选器来找到正确的筛选器

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

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

一旦我们找到了符合步骤2-4中所有过滤器的正确父DIV,我们需要找到具有子输入的子DIV。这是需要单击的最终输入

现在转到代码。您不再需要(至少对于此任务而言)
patientList
patientsDOB
,因此可以删除它们

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();

我可能会将名字和姓氏倒过来,因此您可能需要切换变量名。

您的HTML无效。我尝试修复它,但仍然存在关闭标记不匹配等问题。请重新提取HTML并更新您的问题。我们不需要超过2名患者,但我认为这些患者的父元素是必需的uired。我想我已经找出了问题所在,并进行了修复,以确保其一致性。请验证它是否与您的网站HTML结构匹配。