我正在使用 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 添加按键
由于 try 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:重置行数
再次使用定位器间谍,我发现行的索引被重置为零,所以我在我的代码中模仿了它:
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()
没有),但还没有找到。
如何在 Silk4J 中获取 SapTable 的实际行数?