Извлечение текста из веб-драйвера селена

HTML:

<tr valign="top"> 
<td> 
  <p align="left"><font face="Arial, Helvetica, sans-serif" size="2"><b><font face="Arial, Helvetica, sans-serif" size="2"><img src="/images/printit.gif" width="57" height="69" align="right"></font><font size="+1">Your 
    itinerary has been booked!</font></b><br>

    <br>
    Please print a copy of this screen for your records. Thank you for choosing 
    Mercury Tours.<br>
    <br>
    </font></p>
</td>
</tr>

Я пытаюсь получить текст Your itinerary has been booked! а также Please print a copy of this screen for your records. Thank you for choosing Mercury Tours.

Я попытался с помощью tagName и xpath извлечь текст и отсортировать его. Но есть ли здесь какой-то уникальный локатор, который можно использовать здесь?

3 ответа

Решение

Согласно предоставленному HTML строки таблицы, я не уверен, что может быть уникальным локатором. Может быть, ниже предоставленного cssSelector будет уникальным для извлечения текста:

tr[valign = 'top'] > td > p[align = 'left']

Вы можете использовать выше cssSelector, если он не уникален, вам нужно поделиться более подробной информацией о таблице HTML. Так что я мог бы предоставить вам уникальный локатор.

Или, если вы хотите найти этот элемент с текстом, вы можете использовать ниже xpath который был бы уникальным:

.//td[contains(.,'itinerary has been booked')]

Много дней назад я столкнулся с этой проблемой. У этого есть два подхода, чтобы решить эту проблему

  • используя normailize-space из xpath. Пример в моем проекте, я должен получить текст в элементе tr с тегом br String temp = td.findElement(By.xpath(".//span[normalize-space()]")).getText();
    • используя JavaScript, чтобы получить контент с помощью селектора CSS. Я использовал первый подход. Извините, если мой английский не очень хорош

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

  HashMap<Integer, HashMap<String, String>> tableData = new HashMap<Integer, HashMap<String, String>>();
  HashMap<String, String> tableCellDataMap = null;
  WebElement table = driver.findElement(By.id("<table_id>"));

  /**
   *  Call this method to get Table Cell Data by passing WebElement table
   *  @Params table
   *  
   *  @author Fayaz
   **/
  public static HashMap<String, String> getTableData(WebElement table) {
  List<WebElements> tableColHeaders = table.findElements(By.tagName("th"));
  List<WebElements> tableRows = table.findElements(By.tagName("tr"));

  // Start rowIndex with '1' because in the zeroth index we get 'th' tags   
  for(int rowIndex = 1; rowIndex < tableRows.size(); rowIndex++) {
     List<WebElement> tableCells = tableRows.get(rowIndex).findElements(By.tagName("td"));
     for(int cellIndex = 0; cellIndex < tableCells.size(); cellIndex++) {
         String tableCellData = tableCells.get(cellIndex).getText();
         String tableColName  = tableColHeaders.get(cellIndex).getText();
         tableCellDataMap     = new HashMap<String, String>();
         tableCellDataMap.put(tableColName, tableCellData);
     }
     tableData.put(rowIndex, tableCellDataMap);
  }
  return tableCellDataMap;
 }

На самом деле, это может быть еще более модульным, чтобы сделать утилиту Table с такими методами, как, getTableHeader(), getRowSize(), getColSize(), getData(int rowIndex), getData(int colIndex)

Другие вопросы по тегам