Я хочу напечатать некоторые данные с помощью селена, вот HTML:
<div class = "details-row section box-margin-LRmd is-disabled">
<div class = "inline-flex-group-v2">
<div class = "item gutter-sm box-fixed col-encounter-type">
<label class = "field-label">Encounter type</label>
<div data-element = "encounter-details-encounter-type">
Office Visit
<!----> </div>
</div>
<div class = "item gutter-sm box-fixed col-extra-padding">
<label class = "field-label">Note type</label>
<div data-element = "encounter-details-encounter-type">Case Review</div>
</div>
<div class = "item gutter-sm box-fixed col-date">
<label class = "field-label">Date</label>
<div data-element = "encounter-details-date" class = "clearfix">
05/01/2018
</div>
</div>
<div class = "item gutter-sm box-fixed col-age visible-lg">
<label class = "field-label">Age at encounter</label>
<div data-element = "encounter-details-age">60 yrs</div>
</div>
<div class = "item gutter-sm box-fixed col-extra-padding visible-xl">
<label class = "field-label">Seen by</label>
<div data-element = "encounter-details-seen-by">Kristina Abernathy</div>
</div>
<div class = "item gutter-sm box-fixed col-extra-padding visible-xl">
<label class = "field-label">Facility</label>
<div data-element = "encounter-details-facility">FOCUS Pittsburgh Free Health Center</div>
</div>
<div class = "item gutter-sm visible-xl">
<label class = "field-label">Status</label>
<div>
<span data-element = "encounter-details-signed-by">Electronically signed by Kristina Abernathy at 05/01/2018 07:21 pm</span>
</div>
</div>
<!----> </div>
<div class = "inline-flex-group-v2 hidden-xl box-padding-Tmd-v2 lower">
<div class = "item gutter-lg box-fixed col-age hidden-lg">
<label class = "field-label">Age at encounter</label>
<div data-element = "encounter-details-age">60 yrs</div>
</div>
<div class = "item gutter-lg box-fixed col-seen-by">
<label class = "field-label">Seen by</label>
<div data-element = "encounter-details-seen-by">Kristina Abernathy</div>
</div>
<div class = "item gutter-lg box-fixed">
<label class = "field-label">Facility</label>
<div data-element = "encounter-details-facility">Health Center</div>
</div>
<div class = "item gutter-sm">
<label class = "field-label">Status</label>
<div>
<span data-element = "encounter-details-signed-by">Electronically signed by Kristina Abernathy at 05/01/2018 07:21 pm</span>
</div>
</div>
<!----> </div>
</div>
Я хочу напечатать тип встречи, тип заметки, дату, возраст и кто видел. Поэтому я использую код:
System.out.println("Encounter details");
System.out.println("ENCOUNTER TYPE: " + driver.findElement(By.xpath("//div[@data-element='encounter-details-encounter-type']")).getText());
System.out.println("NOTE TYPE: " + driver.findElement(By.xpath("//div[@data-element='encounter-details-encounter-type']")).getText());
System.out.println("DATE: " + driver.findElement(By.xpath("//div[@data-element='encounter-details-date']")).getText());
System.out.println("AGE OF ENCOUNTER: " + driver.findElement(By.xpath("//div[@data-element='encounter-details-age']")).getText());
System.out.println("SEEN BY: " + driver.findElement(By.xpath("//div[@data-element='encounter-details-seen-by']")).getText());
И я получил:
Encounter details
ENCOUNTER TYPE: Office Visit
NOTE TYPE: Office Visit
DATE: 05/01/2018
AGE OF ENCOUNTER: 60 yrs
SEEN BY:
Таким образом, тип встречи и тип заметки имеют один и тот же атрибут «data-element = 'expect-details-meet-type'», поэтому я получил одинаковый результат для «подробностей встречи» и «типа встречи», но я хочу получить то, что
ENCOUNTER TYPE: Office Visit
NOTE TYPE: Case Review
DATE: 05/01/2018
AGE OF ENCOUNTER: 60 yrs
SEEN BY: Kristina Abernathy
Итак, как мне получить правильный тип заметки и почему я не могу получить контент "ПОСМОТРЕТЬ"? Спасибо!
Добавьте родительский узел в локатор, чтобы сузить область поиска encounter type
и note type
.
Причина, по которой вы становитесь пустым на SEEN BY
, я думаю, он не отображается на странице или ваш локатор обнаружил более одного элемента, а первый элемент не имеет текстового содержимого. Если он не виден, вы можете использовать getAttribute("innerText")
для получения текстового содержимого элемента.
System.out.println("Encounter details");
System.out.println("ENCOUNTER TYPE: " + driver
.findElement(By.cssSelector("div.col-encounter-type div[data-element='encounter-details-encounter-type']"))
.getText());
System.out.println("NOTE TYPE: " + driver
.findElement(By.cssSelector("div.col-extra-padding div[data-element='encounter-details-encounter-type']"))
.getText());
System.out.println("DATE: " + driver
.findElement(By.cssSelector("div[data-element='encounter-details-date']"))
.getText());
System.out.println("AGE OF ENCOUNTER: " + driver
.findElement(By.cssSelector("div[data-element='encounter-details-age']"))
.getText());
System.out.println("SEEN BY: " + driver
.findElement(By.cssSelector("div[data-element='encounter-details-seen-by']"))
.getAttribute("innerText"));
Из вашего html я вижу, что поля Тип встречи и Тип примечания используют один и тот же элемент для справки. Вот почему вы получаете одинаковый результат для разных заголовков. Пока вы выбираете локаторы для идентификации элемента, лучше использовать уникальные значения для этого элемента, иначе возникнут проблемы такого рода. Пожалуйста, сверьтесь с приведенным ниже кодом для Тип примечания,
System.out.println("NOTE TYPE: " + driver.findElement(By.xpath("//div[label='Note type']//*[@data-element='encounter-details-encounter-type']")).getText());
Я проверил поле ВИДЕННЫЙ, все работает нормально.
Но если вы хотите взять первую запись ВИДЕННЫЙ, используйте приведенный ниже код,
System.out.println("SEEN BY: " + driver.findElement(By.xpath("//div[contains(@class,'extra-padding visible-xl')]//*[@data-element='encounter-details-seen-by']")).getText());
Для второго ВИДЕННЫЙ,
System.out.println("SEEN BY: " + driver.findElement(By.xpath("//div[contains(@class,'fixed col-seen-by')]//*[@data-element='encounter-details-seen-by']")).getText());
Чтобы получить Детали встречи, вы можете создать два Списки, один для Заголовки, а другой для Значения, и распечатать их следующим образом:
List<WebElement> items = driver.findElements(By.xpath("//div[@class='inline-flex-group-v2']//div[contains(@class,'item') and contains(@class,'gutter-sm') and contains(@class,'box-fixed')]/label"));
List<WebElement> value = driver.findElements(By.xpath("//div[@class='inline-flex-group-v2']//div[contains(@class,'item') and contains(@class,'gutter-sm') and contains(@class,'box-fixed')]//div[starts-with(@data-element,'encounter-details-')]"));
for(int i=0; i<items.size(); i++)
System.out.println(items.get(i).getText() + " value is : " + value.get(i).getText());
В соответствии с вашим требованием вы можете использовать cssSelector для Тип примечания.
Код вы можете попробовать:
System.out.println("NOTE TYPE: " + driver.findElement(By.cssSelector("div[class$='col-extra-padding'] div")).getText());
Если вы все еще хотите использовать Xpath, вы можете попробовать этот код
Xpath:
//label[text()='Note type']/following-sibling::div
Код:
System.out.println("NOTE TYPE: " + driver.findElement(By.xpath("//label[text()='Note type']/following-sibling::div")).getText());
Есть два Виденный:
Для первый вы можете написать cssSelector как:
div[class*='col-extra-padding']>div[data-element$='-seen-by']
Код
System.out.println("First Seen By: " + driver.findElement(By.cssSelector("div[class*='col-extra-padding']>div[data-element$='-seen-by']")).getText());
Xpath будет:
//div[contains(@class,'col-extra-padding')]/child::div[@data-element='encounter-details-seen-by']
Код:
System.out.println("First Seen By: " + driver.findElement(By.xpath("//div[contains(@class,'col-extra-padding')]/child::div[@data-element='encounter-details-seen-by']")).getText());
Для ВторойВиденный вы можете записать cssSelector как:
cssSelector:
div[class*='box-padding-Tmd'] div[class$='col-seen-by'] div
Код
System.out.println("Second Seen By: " + driver.findElement(By.cssSelector("div[class*='box-padding-Tmd'] div[class$='col-seen-by'] div")).getText());
Xpath:
//div[contains(@class,'box-padding-Tmd')]/child::div[contains(@class,'col-seen-by')]/child::div
Код
System.out.println("Second Seen By: " + driver.findElement(By.xpath("//div[contains(@class,'box-padding-Tmd')]/child::div[contains(@class,'col-seen-by')]/child::div ")).getText());