封装滚动列表

时间:2017-05-29 20:08:02

标签: java selenium lambda

我使用Selenium在Java中编码。并且有一组代码我发现自己从一个UI动作复制到另一个UI动作 - 滚动表格。我觉得我需要将它封装在一个项目中,但我不确定如何。

(注意:我没有使用页面对象模型,因为我不会有很多具有相同UI元素的测试用例; UI页面很复杂,设计页面对象需要很长时间。无论如何,我不知道在这种情况下使用POM本身会有什么帮助 - 代码复制只是在页面对象而不是测试用例中。“

所以 - 可能有一个Dojo列表可能会也可能不会滚动。我需要阅读列表中的所有元素。这是其中一个案例中的一些代码。 (groupNav是以前找到的WebElement;在其他情况下,它可以是其他元素。)

    JavascriptExecutor jse = (JavascriptExecutor) driver;

    WebElement gridxVScroller = null;
    boolean finishedScrolling = true;
    String prevTop = "-1";
    try {
        gridxVScroller = groupNav.findElement(By.className("gridxVScroller"));
        // if we are here and no exception has happened, there is a
        // scroller element
        if (!gridxVScroller.isDisplayed()) {
            // if the scroller is not visible, we do not use it
            gridxVScroller = null;
        } else {
            // ensure scrolling starts from the top
            jse.executeScript("arguments[0].scrollTop = 0;", gridxVScroller);
        }
    } catch (NoSuchElementException nse) {
        // there is no scroller, this is normal, do nothing
    }


    // the following loop is the scrolling loop if there is a scroller
    // if there is no scroller, the loop is executed exactly once
    do {
        //... PROCESSING OF LIST ELEMENTS THAT ARE CURRENTLY AVAILABLE GOES HERE

        // if there is a scroller, send a PgDn, wait, then check if the
        // scrolling is finished
        if (gridxVScroller != null) {
            gridxVScroller.sendKeys(Keys.PAGE_DOWN);
            Utilities.wait(1); // the scroll needs a second to render,
                                // otherwise
                                // even scrollTop does not change
            String currentTop = String
                    .valueOf(jse.executeScript("return arguments[0].scrollTop;", gridxVScroller));
            finishedScrolling = (currentTop.equals(prevTop));
            prevTop = currentTop;
        }
    } while (!finishedScrolling);

所以,我有点厌倦了复制代码,只改变处理部分。但是如何将它封装在Java中的辅助对象中?

我现在有两个想法。

(1)在构造函数中,确定是否有滚动条。然后有一个方法按下PgDn并确定滚动是否已经结束。调用者代码如下所示:

ScrollHelper scrollHelper = new ScrollHelper(groupNav);
do {
    // PROCESSING GOES HERE
while (scrollHelper.continueScrolling());

(2)传递一个函数参数,在函数中提供处理逻辑。我实际上可以在对象中找到所有列表元素,并为每个元素调用处理函数。这就是我在Python中所做的,但在Java中,虽然Java 8中存在这种功能,但我还是不确定如何处理它。

在Python中,我会传递一个lambda或一个本地函数。代码仍然可以访问函数中的所有局部变量。在Java中,本地函数不存在,lambdas似乎意味着其他东西。所以我必须创建一个单独的方法并使用私有字段与它进行通信?

无论如何 - 我应该采取哪种方法?还是有第三个我没注意到的?

0 个答案:

没有答案