Как мне выбрать предыдущий родственный Xpath

#java #selenium-webdriver

#java #selenium-webdriver

Вопрос:

Я считываю значение из Excel с помощью apache poi, а затем сравниваю это значение с пользовательским интерфейсом. Для поиска записи в пользовательском интерфейсе я ввожу 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 записи, как показано выше, я хочу поставить галочку для записи no2, поскольку DOB-10/08/1988 совпадает с DOB записи, которую я прочитал из Excel.

Я пытался использовать следующий код, но не сработал.

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

Комментарии:

1. Ваш HTML недопустим. Я попытался исправить это, но все еще есть проблемы с несоответствующими закрывающими тегами и т.д. Пожалуйста, повторно извлеките HTML и обновите свой вопрос. Нам не нужно более 2 пациентов, но, я думаю, потребуется родительский элемент для них.

2. Я думаю, я понял, в чем проблема, и исправил ее, чтобы она была последовательной. Пожалуйста, убедитесь, что он соответствует структуре HTML вашего сайта.

Ответ №1:

Вы можете сделать это с помощью одного локатора, но он будет большим. Я расскажу вам, как он построен, так что, надеюсь, это имеет какой-то смысл.

Это полный 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 довольно стандартная, и вы, вероятно, понимаете это … он находит DIV, который содержит класс ‘slick-row’. Это родительский DIV для каждого блока HTML, который представляет пациента и его информацию. Для каждого пациента есть один из них. Нам нужно добавить больше фильтров, чтобы найти правильный.

Часть 2 — это взять потенциальные родительские DIV из части 1 и найти тот, у которого есть дочерний DIV, который имеет класс ‘r1’, а также содержит текст ‘ANTRA’ (обратите внимание на пробелы вокруг текста).

Части 3 и 4 являются параллелями части 2… просто добавьте фильтры в DIV из части 1, где они содержат имя и DOB.

Как только мы нашли правильный родительский DIV, который соответствует всем фильтрам на шагах 2-4, нам нужно найти дочерний 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();
  

У меня могут быть имя и фамилия в обратном порядке, поэтому вам может потребоваться переключить имена переменных.