java - 如何选择前面的同级 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();
}
解决方案
您可以使用单个定位器执行此操作,但它会很大。我会带你了解它是如何构建的,希望它有一些意义。
这是完整的 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。
现在到代码。您不再需要(至少对于此任务)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();
我的名字和姓氏可能倒过来了,所以你可能需要切换变量名。
推荐阅读
- javascript - 正文滚动 40px(n px) 后如何滚动其他元素或标题
- laravel - 表单标签不路由到控制器
- angular - Angular 2+,异步测试和 setTimeout
- c++ - C++ Eclipse:二进制搜索树节点-> 数据 = 变量似乎不起作用
- kotlin - 为什么每个辅助构造函数都需要委托给 Kotlin 中的主构造函数?
- android - Android 模拟器在 Ubuntu 18.04 上使用 SIGSEGV 崩溃
- apache-spark - 如何使用 Spark Dataframe 读写 Cassandra 表?
- php - 在 PHP 中使用正则表达式更改文件链接路径结构
- android - 混合版本可能导致运行时崩溃,没有解决方案工作
- c - 分段错误:使用调用“ls”时为 11