1

我正在使用 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 的实际行数?

4

1 回答 1

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