首页 > 解决方案 > 如何选择前面的同级 Xpath

问题描述

我正在使用 apache poi 从 Excel 中读取值,然后将该值与 UI 进行比较。要将记录搜索到 UI,我输入名字和姓氏,因为没有任何唯一字段。对于一些记录获得多个记录作为搜索结果。然后我在 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 条记录,我想为记录 no2 打勾,因为 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();
}

标签: javaselenium-webdriver

解决方案


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

这是完整的 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 部分非常标准,您可能理解它......它找到了一个包含类 'slick-row' 的 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();

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


推荐阅读