В вопросе было несколько ревизий HTML, и именно это я использовал, чтобы придумать решение:
<div id="ember4342" class="ember-view flowsheet-table">
<div class="header flowsheet-column">
<div class="flowsheet-cell flowsheet-row">
</div>
<div id="ember4352" class="ember-view flowsheet-row header-row">
<h4 class="header4semibold " data-ember-action="4353">
<div class="ellipsis" style="width: 694px">Vitals</div>
</h4>
</div>
<div id="ember4355" class="ember-view flowsheet-row ellipsis"> Height
</div>
<div id="ember4357" class="ember-view flowsheet-row ellipsis"> Weight
</div>
<div id="ember4359" class="ember-view flowsheet-row ellipsis"> BMI
</div>
<div id="ember4361" class="ember-view flowsheet-row ellipsis"> BMI Percentile
</div>
<div id="ember4363" class="ember-view flowsheet-row ellipsis"> BP
</div>
<div id="ember4365" class="ember-view flowsheet-row ellipsis"> Temperature
</div>
<div id="ember4367" class="ember-view flowsheet-row ellipsis"> Pulse
</div>
<div id="ember4369" class="ember-view flowsheet-row ellipsis"> Respiratory rate
</div>
<div id="ember4371" class="ember-view flowsheet-row ellipsis"> O2 Saturation
</div>
<div id="ember4373" class="ember-view flowsheet-row ellipsis"> Pain
</div>
<div id="ember4375" class="ember-view flowsheet-row ellipsis"> Head Circumference
</div>
</div>
<div class="flowsheet-scroll-region">
<div id="ember5636" class="ember-view flowsheet-column">
<div class="flowsheet-cell flowsheet-table-header selectable" data-ember-action="5637">
<!---->
<div class="p-semibold">10/17/16</div>
<div class="p-semibold"><!----></div>
<!----></div>
<div id="ember5639" class="ember-view flowsheet-cell header-row"><!----></div>
<div id="ember5641" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">64 </span><span class="p-666"
data-element="flowsheet-cell-units">in</span>
</div>
<div id="ember5643" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">106 </span><span class="p-666"
data-element="flowsheet-cell-units">lb</span>
</div>
<div id="ember5645" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">18.19 </span><span class="p-666"
data-element="flowsheet-cell-units"><!----></span>
</div>
<div id="ember5647" class="ember-view flowsheet-cell"><!----></div>
<div id="ember5649" class="ember-view flowsheet-cell selectable wide-cell"><!----><!---->
<span data-element="flowsheet-cell-value" class="">111/83 </span><span class="p-666"
data-element="flowsheet-cell-units">mmHg</span>
</div>
<div id="ember5651" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">100.9 </span><span class="p-666"
data-element="flowsheet-cell-units">°F</span>
</div>
<div id="ember5653" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">86 </span><span class="p-666"
data-element="flowsheet-cell-units">bpm</span>
</div>
<div id="ember5655" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">14 </span><span class="p-666"
data-element="flowsheet-cell-units">bpm</span>
</div>
<div id="ember5657" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5659" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5661" class="ember-view flowsheet-cell selectable"><!----></div>
</div>
<div id="ember5663" class="ember-view flowsheet-column editable">
<div class="flowsheet-cell flowsheet-table-header selectable" data-ember-action="5664">
<!---->
<div class="p-link-semibold" data-element="flowsheet-column-date">11/17/17</div>
<div class="p-link-semibold" data-element="flowsheet-column-time"><!----></div>
<!----></div>
<div id="ember5666" class="ember-view flowsheet-cell header-row"><!----></div>
<div id="ember5668" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">64 in</div>
</div>
<div id="ember5670" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">109.99 lb</div>
</div>
<div id="ember5672" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">18.88 </span><span class="p-666"
data-element="flowsheet-cell-units"><!----></span>
</div>
<div id="ember5674" class="ember-view flowsheet-cell"><!----></div>
<div id="ember5676" class="ember-view flowsheet-cell selectable wide-cell"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">116/72 mmHg</div>
</div>
<div id="ember5678" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">101.2 °F</div>
</div>
<div id="ember5680" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">87 bpm</div>
</div>
<div id="ember5682" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">16 bpm</div>
</div>
<div id="ember5684" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5686" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5688" class="ember-view flowsheet-cell selectable"><!----></div>
</div>
<div id="ember5690" class="ember-view flowsheet-column editable">
<div class="flowsheet-cell flowsheet-table-header selectable" data-ember-action="5691">
<!---->
<div class="p-link-semibold" data-element="flowsheet-column-date">01/17/18</div>
<div class="p-link-semibold" data-element="flowsheet-column-time"><!----></div>
<!----></div>
<div id="ember5693" class="ember-view flowsheet-cell header-row"><!----></div>
<div id="ember5695" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">64 in</div>
</div>
<div id="ember5697" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">106 lb</div>
</div>
<div id="ember5699" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">18.19 </span><span class="p-666"
data-element="flowsheet-cell-units"><!----></span>
</div>
<div id="ember5701" class="ember-view flowsheet-cell"><!----></div>
<div id="ember5703" class="ember-view flowsheet-cell selectable wide-cell"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">123/84 mmHg</div>
</div>
<div id="ember5705" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">100.3 °F</div>
</div>
<div id="ember5707" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">77 bpm</div>
</div>
<div id="ember5709" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">14 bpm</div>
</div>
<div id="ember5711" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5713" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5715" class="ember-view flowsheet-cell selectable"><!----></div>
</div>
<div id="ember5717" class="ember-view flowsheet-column editable">
<div class="flowsheet-cell flowsheet-table-header selectable" data-ember-action="5718">
<!---->
<div class="p-link-semibold" data-element="flowsheet-column-date">02/17/18</div>
<div class="p-link-semibold" data-element="flowsheet-column-time"><!----></div>
<!----></div>
<div id="ember5720" class="ember-view flowsheet-cell header-row"><!----></div>
<div id="ember5722" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">64 in</div>
</div>
<div id="ember5724" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">106 lb</div>
</div>
<div id="ember5726" class="ember-view flowsheet-cell selectable"><!----><!---->
<span data-element="flowsheet-cell-value" class="">18.19 </span><span class="p-666"
data-element="flowsheet-cell-units"><!----></span>
</div>
<div id="ember5728" class="ember-view flowsheet-cell"><!----></div>
<div id="ember5730" class="ember-view flowsheet-cell selectable wide-cell"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">121/70 mmHg</div>
</div>
<div id="ember5732" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">100.8 °F</div>
</div>
<div id="ember5734" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">77 bpm</div>
</div>
<div id="ember5736" class="ember-view flowsheet-cell selectable"><!----><!---->
<div data-element="flowsheet-cell-value-and-units" class="p-link">18 bpm</div>
</div>
<div id="ember5738" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5740" class="ember-view flowsheet-cell selectable"><!----></div>
<div id="ember5742" class="ember-view flowsheet-cell selectable"><!----></div>
</div>
<div id="ember5743" class="ember-view flowsheet-column flowsheet-add-column current-context">
<div class="flowsheet-cell selectable" data-ember-action="5744">
<a class="icon icon-add" data-element="flowsheet-add-column-button"></a>
</div>
<div class="flowsheet-cell header-row"></div>
<div class="flowsheet-cell selectable" data-ember-action="5745"></div>
<div class="flowsheet-cell selectable" data-ember-action="5746"></div>
<div class="flowsheet-cell selectable" data-ember-action="5747"></div>
<div class="flowsheet-cell selectable" data-ember-action="5748"></div>
<div class="flowsheet-cell selectable" data-ember-action="5749"></div>
<div class="flowsheet-cell selectable" data-ember-action="5750"></div>
<div class="flowsheet-cell selectable" data-ember-action="5751"></div>
<div class="flowsheet-cell selectable" data-ember-action="5752"></div>
<div class="flowsheet-cell selectable" data-ember-action="5753"></div>
<div class="flowsheet-cell selectable" data-ember-action="5754"></div>
<div class="flowsheet-cell selectable" data-ember-action="5755"></div>
</div>
</div>
<div id="ember4390" class="ember-view"><!----></div>
<div id="ember4399" class="ember-view"><!---->
<!----></div>
<div id="ember4400" class="ember-view"><!----></div>
</div>
Вот полный сценарий. Запуск занимает несколько секунд, потому что были некоторые короткие, но необходимые тайм-ауты, чтобы выдержать из-за потенциальных отклонений в структуре элементов единиц и значений:
import org.openqa.selenium.By;
import org.openqa.selenium.SearchContext;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class WebDriverScratch {
private static final String CHROME_DRIVER = "C:\\Users\\Joe\\Downloads\\chromedriver_win32\\chromedriver.exe";
private static final String HTML_FILE = "file:///C:/Users/Joe/IdeaProjects/scratch/src/main/resources/test.html";
private static final long SHORT_TIMEOUT = 1; // 1 second
private static final long VERY_SHORT_TIMEOUT_MILLIS = 100; // 100 milliseconds
private static final String EMPTY = "";
public static void main(String[] args) {
WebDriver driver = getDriver();
driver.get(HTML_FILE);
driver.manage().timeouts().implicitlyWait(SHORT_TIMEOUT, TimeUnit.SECONDS);
List<WebElement> labels = driver.findElements(By.cssSelector("div.header div.flowsheet-row.ellipsis"));
List<WebElement> dateElms = driver.findElements(By.cssSelector("div.flowsheet-table-header div:first-child"));
List<ColumnData> cols = new ArrayList<>(dateElms.size());
for (WebElement date : dateElms) {
// parse the data for this column
ColumnData col = new ColumnData(date.getText());
WebElement column = date.findElement(By.xpath("../.."));
List<WebElement> dataCells = column.findElements(By.cssSelector("div.ember-view.flowsheet-cell:not(.header-row)"));
for (int i = 0; i < dataCells.size(); i++) {
// get the header label by index
WebElement dataCell = dataCells.get(i);
String label = labels.get(i).getText();
WebElement valueAndUnits = findElementOrNull(driver, dataCell, By.cssSelector("div[data-element='flowsheet-cell-value-and-units']"));
if (valueAndUnits != null) {
col.addEntry(label, valueAndUnits.getText());
} else {
// could be empty data cell, or separate value and units
WebElement value = findElementOrNull(driver, dataCell, By.cssSelector("span[data-element='flowsheet-cell-value']"));
if (value != null) {
// since value element is present, assume units element is too
WebElement units = dataCell.findElement(By.cssSelector("span[data-element='flowsheet-cell-units']"));
col.addEntry(label, value.getText(), units.getText());
} else {
// empty data
col.addEntry(label, EMPTY);
}
}
}
// done parsing data for this column
cols.add(col);
}
driver.close();
// print it all out
printData(cols);
}
/**
* simple container for holding parsed data
*/
private static class ColumnData {
public class Entry {
public final String label;
public final String valueAndUnits;
public Entry(String label, String valueAndUnits) {
this.label = label;
this.valueAndUnits = valueAndUnits;
}
}
public final String date;
public final List<Entry> entries = new ArrayList<>();
public ColumnData(String date) {
this.date = date;
}
public void addEntry(String label, String valueAndUnits) {
entries.add(new Entry(label, valueAndUnits));
}
public void addEntry(String label, String value, String units) {
entries.add(new Entry(label, String.format("%s %s", value, units)));
}
}
private static WebDriver getDriver() {
System.setProperty("webdriver.chrome.driver", CHROME_DRIVER);
ChromeOptions options = new ChromeOptions();
options.addArguments("disable-infobars");
options.addArguments("start-maximized");
return new ChromeDriver(options);
}
/**
* returns null if element is not present
*/
private static WebElement findElementOrNull(WebDriver driver, SearchContext parent, By by) {
driver.manage().timeouts().implicitlyWait(VERY_SHORT_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
try {
return parent.findElement(by);
} catch (RuntimeException ex) {
return null;
} finally {
driver.manage().timeouts().implicitlyWait(SHORT_TIMEOUT, TimeUnit.SECONDS);
}
}
private static void printData(List<ColumnData> allData) {
for (ColumnData data : allData) {
System.out.println("Date: " + data.date);
for (ColumnData.Entry entry : data.entries) {
System.out.println(String.format(" %s: %s", entry.label, entry.valueAndUnits));
}
}
}
}
Выход:
Date: 10/17/16
Height: 64 in
Weight: 106 lb
BMI: 18.19
BMI Percentile:
BP: 111/83 mmHg
Temperature: 100.9 °F
Pulse: 86 bpm
Respiratory rate: 14 bpm
O2 Saturation:
Pain:
Head Circumference:
Date: 11/17/17
Height: 64 in
Weight: 109.99 lb
BMI: 18.88
BMI Percentile:
BP: 116/72 mmHg
Temperature: 101.2 °F
Pulse: 87 bpm
Respiratory rate: 16 bpm
O2 Saturation:
Pain:
Head Circumference:
Date: 01/17/18
Height: 64 in
Weight: 106 lb
BMI: 18.19
BMI Percentile:
BP: 123/84 mmHg
Temperature: 100.3 °F
Pulse: 77 bpm
Respiratory rate: 14 bpm
O2 Saturation:
Pain:
Head Circumference:
Date: 02/17/18
Height: 64 in
Weight: 106 lb
BMI: 18.19
BMI Percentile:
BP: 121/70 mmHg
Temperature: 100.8 °F
Pulse: 77 bpm
Respiratory rate: 18 bpm
O2 Saturation:
Pain:
Head Circumference: