Проблема, с которой вы сталкиваетесь, заключается в том, как Selenium работает по своему замыслу. Давайте посмотрим, как выполняется JavaScript get или выполняется операция
tds.get(TABLE_COLUMNS.NAME_COL.getNumVal()).getText();
У вас есть коллекция предметов. Каждому объекту присваивается уникальный идентификатор на стороне браузера драйвером селена
Так что, когда вы делаете getText()
ниже, вот что происходит
Your code -> HTTP Request -> Browser Driver -> Browser ->
|
<---------------------------------------------
Теперь, если у вас есть таблица 400rx10c, тогда она учитывает 4000
HTTP-вызовов, даже если один вызов занимает 10 мс, мы смотрим 40000ms~=40sec
, что является приемлемой задержкой для чтения таблицы
Итак, вы хотите получить все данные за один раз, выполнив javascript, который вернет вам 2d массив. Это довольно просто, я нашел код на сайте ниже
http://cwestblog.com/2016/08/21/javascript-snippet-convert-html-table-to-2d-array/
function tableToArray(tbl, opt_cellValueGetter) {
opt_cellValueGetter = opt_cellValueGetter || function(td) { return td.textContent || td.innerText; };
var twoD = [];
for (var rowCount = tbl.rows.length, rowIndex = 0; rowIndex < rowCount; rowIndex++) {
twoD.push([]);
}
for (var rowIndex = 0, tr; rowIndex < rowCount; rowIndex++) {
var tr = tbl.rows[rowIndex];
for (var colIndex = 0, colCount = tr.cells.length, offset = 0; colIndex < colCount; colIndex++) {
var td = tr.cells[colIndex], text = opt_cellValueGetter(td, colIndex, rowIndex, tbl);
while (twoD[rowIndex].hasOwnProperty(colIndex + offset)) {
offset++;
}
for (var i = 0, colSpan = parseInt(td.colSpan, 10) || 1; i < colSpan; i++) {
for (var j = 0, rowSpan = parseInt(td.rowSpan, 10) || 1; j < rowSpan; j++) {
twoD[rowIndex + j][colIndex + offset + i] = text;
}
}
}
}
return twoD;
}
Я предполагаю, что вы храните вышеупомянутый скрипт в переменной SCRIPT
, а затем можете запустить его, как показано ниже
WebDriver driver = ((RemoteWebElement)table).getWrappedDriver();
Object result = ((JavascriptExecutor)driver).executeScript(SCRIPT + "\n return tableToArray(arguments[0]);" , table);
Это даст вам двумерный массив данных, и вы сможете обрабатывать его так, как вам нравится