SapTable中已填充的行数

时间:2015-02-09 09:53:10

标签: sap silktest

我正在使用Silk4J,我有一个在Locator Spy中报告为SapTable的表格。从该表中,我试图获取第二列的所有文本,但它会挂起或以异常终止。在下面,您可以找到我尝试的代码。最后我到达了桌子的最后一排,但它再次挂在那里。

在所有示例中,我使用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 按键

由于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:通过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);
    }
}

按下该键现在可以工作,我可以看到该表滚动到下一个条目。但是,我的测试应用程序仍然挂起。

尝试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()没有),但还没找到。

如何在Silk4J中获取SapTable的实际行数?

1 个答案:

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