我正在使用Silk4J,我有一个在Locator Spy中报告为SapTable
的表格。从该表中,我试图获取第二列的所有文本,但它会挂起或以异常终止。在下面,您可以找到我尝试的代码。最后我到达了桌子的最后一排,但它再次挂在那里。
在所有示例中,我使用while循环而不是for循环,因为我想稍后插入更多条件。
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++;
}
但是,此代码会打印所有可见列,然后挂起。
由于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);
}
不幸的是,这会导致异常“虚拟密钥未启用”。
由于内置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);
}
}
按下该键现在可以工作,我可以看到该表滚动到下一个条目。但是,我的测试应用程序仍然挂起。
再次使用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的项目时挂起(重置后。)
有些人睡不着觉,我可以到达桌子的尽头:
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的实际行数?
答案 0 :(得分:1)
需要一些尝试 - 底层的SAP自动化API在这种情况下并没有真正的帮助 - 但是这里是你如何使其工作:
private List<String> fetchItems() {
SapTable table = desktop.find("sap.Table");
SapVerticalScrollBar scrollBar = table.find("/SapVerticalScrollBar");
// the scrollbar maximum value seems to be a more reliable
// way to get the number of items than getRowCount
int itemCount = scrollBar.getMaximum() + 1;
List<String> items = new ArrayList<String>();
int currentAbsoluteRow = 0;
// the first loop iterates through the table page by page
for (int firstRowInPage = 0;
firstRowInPage < itemCount;
firstRowInPage = scrollToNextPage(firstRowInPage)) {
// this loop goes through the items of the current page
for (int currentRowInPage = 0;
currentRowInPage < table.getVisibleRowCount();
currentRowInPage++) {
if(++currentAbsoluteRow > itemCount) {
// we've read all the available items
return items;
}
SapComponent cell = table.getCell(currentRowInPage, 1);
items.add(cell.getProperty("Text").toString());
}
}
return items;
}
private int scrollToNextPage(int firstRowInPage) {
SapTable table = desktop.find("sap.Table");
SapVerticalScrollBar scrollBar = table.find("/SapVerticalScrollBar");
firstRowInPage += scrollBar.getPageSize();
scrollBar.scrollTo(firstRowInPage);
return firstRowInPage;
}
getRowCount()
返回的计数高于实际项目getVisibleRowCount()
返回适合当前页面的项目数,即使并非所有行都填充了实际项目