#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();
У меня могут быть имя и фамилия в обратном порядке, поэтому вам может потребоваться переключить имена переменных.