我使用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似乎意味着其他东西。所以我必须创建一个单独的方法并使用私有字段与它进行通信?
无论如何 - 我应该采取哪种方法?还是有第三个我没注意到的?