2013-07-11 2 views
3

Я пишу свои вспомогательные методы для тестов на селен. Один из них:Перечни и карты Groovy

private static List<DataRow> parseTable(WebElement table) { 
    List<WebElement> tableHeaders = table.findElements(By.tagName("th")) 
    List<DataRow> dataRow = table.findElements(By.xpath(".//tbody/tr")).collect { 
     Map<String, String> columns = [:] 
     it.findElements(By.tagName("td")).eachWithIndex { item, i -> 
      columns[tableHeaders.get(i).text] = item.text 
     } 
     new DataRow(it, columns) 
    } 
    return dataRow 
} 

И я не люблю эту часть:

it.findElements(By.tagName("td")).eachWithIndex { item, i -> 
     columns[tableHeaders.get(i).text] = item.text 
    } 

Есть ли лучший способ сделать карту из двух списков?

ответ

7

Вы должны быть в состоянии сделать:

def columns = [tableHeaders,it.findElements(By.tagName("td"))].transpose().collectEntries() 

В качестве объяснения:

Дано:

def a = [ 'a', 'b', 'c' ] 
def b = [ 1, 2, 3 ] 

Тогда

def c = [ a, b ].transpose() 
assert c == [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ] 

И:

def d = c.collectEntries() 
assert d instanceof Map 
assert d == [ a:1, b:2, c:3 ] 
+1

обеспечивается мощность 'a' и' b' одинакова? – dmahapatro

+0

@dmahapatro Да, в противном случае вы получите количество элементов на карте, такое же, как и меньший из двух списков. Я предположил, что это так, поскольку приведенный выше пример будет вести себя одинаково (или сбой, если 'tableHeaders' был короче) –

+0

Это имеет смысл, когда вы думаете с точки зрения' rows' и 'columns'. Если в строке для столбца нет элемента, то это не получается транспонированным. И наоборот, если для строки нет столбца, то пренебречь элементом. Например: 'assert [['a', 'b'], [1, 2, 3]]. Transpose() == [['a', 1], ['b', 2]]' 'assert [['a', 'b', 'c'], [1, 2]]. Transpose() == [['a', 1], ['b', 2]]' – dmahapatro

Смежные вопросы