SapTable 中的填充行数
Number of filled rows in a SapTable
我正在使用 Silk4J,我有一个 table,在 Locator Spy 中报告为 SapTable
。从那个 table,我试图获取第二列的所有文本,但它挂起或因异常而终止。在下面,您可以找到我尝试的代码。最后我到达了 table 的最后一行,但它又挂在那里了。
在所有示例中,我都使用 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:通过 Silk 添加 PageDn 按键
由于尝试 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);
}
不幸的是,这会导致异常 "The virtual key is not enabled"。
尝试 3:通过 AwtRobot
添加 PageDn 按键
由于内置的 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);
}
}
按键现在有效,我可以看到 table 滚动到下一个条目。但是,我的测试应用程序仍然挂起。
尝试 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:睡觉
睡一觉,我就能走到尽头了table:
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); // <--
}
}
在这种情况下,我得到了 table 中的所有项目。但由于我不知道 table 何时结束,它又进行了一次 getCell()
调用,导致再次挂起。
问题
我真的卡住了。我还寻找其他方法,例如获取 table 中的实际行数(getRowCount()
没有),但还没有找到。
如何在 Silk4J 中获取 SapTable 的实际行数?
这需要一些尝试 - 底层 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()
returns 适合当前页面的项目数,即使并非所有行都填充了实际项目
- 返回的单元格对象仅在单元格在屏幕上时有效,因此您需要在滚动到下一页之前提取所需的信息。
我正在使用 Silk4J,我有一个 table,在 Locator Spy 中报告为 SapTable
。从那个 table,我试图获取第二列的所有文本,但它挂起或因异常而终止。在下面,您可以找到我尝试的代码。最后我到达了 table 的最后一行,但它又挂在那里了。
在所有示例中,我都使用 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:通过 Silk 添加 PageDn 按键
由于尝试 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);
}
不幸的是,这会导致异常 "The virtual key is not enabled"。
尝试 3:通过 AwtRobot
添加 PageDn 按键由于内置的 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);
}
}
按键现在有效,我可以看到 table 滚动到下一个条目。但是,我的测试应用程序仍然挂起。
尝试 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:睡觉
睡一觉,我就能走到尽头了table:
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); // <--
}
}
在这种情况下,我得到了 table 中的所有项目。但由于我不知道 table 何时结束,它又进行了一次 getCell()
调用,导致再次挂起。
问题
我真的卡住了。我还寻找其他方法,例如获取 table 中的实际行数(getRowCount()
没有),但还没有找到。
如何在 Silk4J 中获取 SapTable 的实际行数?
这需要一些尝试 - 底层 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()
returns 适合当前页面的项目数,即使并非所有行都填充了实际项目- 返回的单元格对象仅在单元格在屏幕上时有效,因此您需要在滚动到下一页之前提取所需的信息。