Я использую Silk4J, и у меня есть таблица, которая указана как SapTable
в Locator Spy. Из этой таблицы я пытаюсь получить все тексты второго столбца, но он зависает или завершается с исключением. Ниже вы найдете код для моих попыток. Наконец я добрался до последней строки таблицы, но она снова зависла там.
Во всех примерах я использую цикл while вместо цикла for, потому что позже я хочу вставить дополнительные условия.
Попытка 1: Прямо вперед (я думал)
SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
while (row < maxrows)
{
String text = table.getCell(row, COLUMN).getText();
logger.debug(text);
row++;
}
Однако этот код печатает все видимые столбцы, а затем зависает.
Попробуйте 2: добавьте нажатие клавиши PageDn через Silk
Поскольку попытка 1 напечатала только видимые ячейки, я подумал, что может помочь добавление нажатия клавиши на каждой странице. Это был мой код:
SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
String text = table.getCell(row, COLUMN).getText();
logger.debug(text);
row++;
if (row % visibleRows == 0)
window.sendVKey(VKey.PAGE_DOWN);
}
К сожалению, это приводит к исключению «Виртуальный ключ не включен».
Попробуйте 3: добавьте нажатие клавиши PageDn через AwtRobot
Так как встроенный метод sendVKey
не сработал, но нажатие PageDn вручную работает, я переключился на AwtRobot:
SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
String text = table.getCell(row, COLUMN).getText();
logger.debug(text);
row++;
if (row % visibleRows == 0)
{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
}
}
Нажатие клавиши теперь работает, и я вижу, как таблица прокручивается до следующей записи. Однако мое тестовое приложение все еще зависает.
Попробуйте 4: сброс количества строк
Снова используя Locator Spy, я обнаружил, что индекс строки сбрасывается до нуля, поэтому я имитировал это в своем коде:
SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
String text = table.getCell(row, COLUMN).getText();
logger.debug(text);
row++;
if (row % visibleRows == 0)
{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
row = 0; // <--
}
}
В этом случае он печатает первые N (количество видимых) элементов списка, пролистывает до позиции N+1, печатает название первой (!) строки и затем зависает при обращении к элементу с индексом 1 (после сброса ).
Попытка 5: сон
Немного поспав, я могу дотянуться до конца стола:
SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
String text = table.getCell(row, COLUMN).getText();
logger.debug(text);
row++;
if (row % visibleRows == 0)
{
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
row = 0;
Thread.sleep(1000); // <--
}
}
В этом случае я получаю все элементы в таблице. Но так как я не знаю, когда заканчивается таблица, она делает еще один вызов getCell()
, что снова приводит к зависанию.
Вопрос
Я действительно застрял. Я также искал другие методы, такие как получение реального количества строк в таблице (getRowCount()
нет), но пока не нашел.
Как получить реальное количество строк SapTable в Silk4J?