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 适合当前页面的项目数,即使并非所有行都填充了实际项目
  • 返回的单元格对象仅在单元格在屏幕上时有效,因此您需要在滚动到下一页之前提取所需的信息。