Как получить доступ и распечатать данные с помощью Xpath через Selenium WebDriver - PullRequest
0 голосов
/ 02 мая 2018

Я хочу напечатать некоторые данные, используя селен, вот 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 = 'Встреча-детали-встреча-тип'", поэтому я получил тот же результат для "деталей встречи" и "типа встречи", но я хочу, чтобы получить это

ENCOUNTER TYPE: Office Visit
NOTE TYPE: Case Review
DATE: 05/01/2018
AGE OF ENCOUNTER: 60 yrs
SEEN BY: Kristina Abernathy

Так как мне получить правильный тип заметки и почему я не могу получить контент "SEEN BY"? Спасибо!

Ответы [ 4 ]

0 голосов
/ 02 мая 2018

Согласно вашему требованию, вы можете использовать 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());
0 голосов
/ 02 мая 2018

Из вашего html я вижу, что в поле Тип встречи и Тип примечания используется один и тот же элемент для справки. Вот почему вы получаете одинаковый результат для разных заголовков. Пока вы выбираете локаторы для идентификации элемента, лучше использовать уникальные значения для этого элемента, иначе возникнут проблемы такого рода. Пожалуйста, проверьте с помощью приведенного ниже кода для Примечание Тип ,

System.out.println("NOTE TYPE: " + driver.findElement(By.xpath("//div[label='Note type']//*[@data-element='encounter-details-encounter-type']")).getText());

Я проверил SEEN BY поле, оно работает нормально.

Но если вы хотите взять первую запись SEEN BY , используйте следующий код:

System.out.println("SEEN BY: " + driver.findElement(By.xpath("//div[contains(@class,'extra-padding visible-xl')]//*[@data-element='encounter-details-seen-by']")).getText());

Для второго SEEN BY ,

System.out.println("SEEN BY: " + driver.findElement(By.xpath("//div[contains(@class,'fixed col-seen-by')]//*[@data-element='encounter-details-seen-by']")).getText());
0 голосов
/ 02 мая 2018

Чтобы получить Сведения о встрече , вы можете создать два Списка , один для Заголовков , а другой для Значения и распечатать их. следующим образом:

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());
0 голосов
/ 02 мая 2018

Добавьте родительский узел в локатор, чтобы сузить область поиска 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"));
...