【问题标题】:Check if swiping on mobile screen loads a new element检查在移动屏幕上滑动是否加载了新元素
【发布时间】:2019-07-10 00:53:26
【问题描述】:

在我们的移动应用程序中,我们有几个屏幕,我们需要在屏幕上滑动以查看元素或滑动加载新元素。在我们的代码中,每当我们去检查一个元素是否存在时,我们都会调用一个方法来检查屏幕上当前的一组元素,然后滑动并在滑动后再次读取屏幕上的所有元素。现在,比较两个列表中的最后一个元素以检查是否加载了新元素。如果没有加载新元素,那么我们得出结论,我们正在寻找的元素没有加载到屏幕上。下面是我为此目的编写的代码。此代码应识别滑动是否正在加载新元素。

问题在于我读取所有元素并加载到列表的步骤。这一步变得非常繁重,有时会导致代码执行超过 5 分钟。

有人可以建议我是否可以在这里做得更好。

public synchronized boolean isScrollingLoadsNewElement (AppiumDriver<MobileElement> driver)
    {
        boolean isNewElementLoaded = false;
        System.out.println("inside the new method to scroll and check new element");
        //declare a list to accept all the elements on current screen
        //go to the end of the list to read the last element. Store in a variable
    this.driver = driver;

    List<MobileElement> lAllElements = this.driver.findElements(By.xpath(".//*"));

    System.out.println("list of element before swiping has been read");
    MobileElement lastElement = lAllElements.get(lAllElements.size()-1);

    //scroll and then again read the list of all elements.
    //read the last element on the list and then compare the elements on above 2 steps. 
    //if the elements are different than return true else false.
    swipeScreen(driver);
    List<MobileElement> lAllElementsAfterSwipe = this.driver.findElements(By.xpath(".//*"));
    System.out.println("list of element after swiping has been read");
    MobileElement lastElementAfterSwipe = lAllElementsAfterSwipe.get(lAllElementsAfterSwipe.size()-1);

    if (lastElementAfterSwipe.equals(lastElement))
        isNewElementLoaded = false;
    else
        isNewElementLoaded = true;
    return isNewElementLoaded;

}

【问题讨论】:

  • 已经回答了,如果有帮助请告诉我:)
  • @Sameer Arora 你的方法肯定会奏效。我们之前有相同的实现,但由于在少数测试用例上硬编码计数器而失败。

标签: java selenium appium appium-ios appium-android


【解决方案1】:

而不是存储所有元素并与下一个状态进行比较,只需在下一次滚动后获取一个元素,确保该元素不应该出现在屏幕上

注意:虽然我没有太多关于你的应用的上下文

【讨论】:

  • 我不确定是否遵循建议。就我而言,我正在尝试决定是否应该继续滚动或停止滚动以查找预期的元素。这就是为什么我在滚动之前将所有元素存储在屏幕上,然后在滚动之后再次存储所有元素。之后,我比较两个列表中的最后一个元素以检查滚动是否正在加载任何新元素。如果滚动没有加载新元素,那么我将找不到我的元素,我的方法将返回 false。
  • 好的,在这种情况下,您无需每次都存储所有元素,而是相应地创建您需要在屏幕上找到的 xpath 或定位器并匹配元素,直到您可以在屏幕上放置循环将起作用
【解决方案2】:

不要匹配滑动前的最后一个元素和滑动后的第一个元素,您应该通过检查其列表大小来检查所需元素是否显示在页面上。

假设您的页面上有 4 个元素,加载后,显示第 5 个元素,按照您的方法,您将检查第 5 个元素与第 4 个元素不同,并且您将通过测试用例,但是这不会让您确定显示的元素是您正在寻找的元素,因为第 5 个元素可以是任何其他不打算显示在页面上但按照您的逻辑进行的元素,测试用例会通过的。

因此,您应该获取要查找的元素的 xpath,然后在每次滑动后检查元素列表大小,因为元素列表大小在页面上显示时会大于 0,您应该限制滑动到一个限制,这样在滑动次数之后,您应该将布尔值返回为 false,否则循环将在无限状态下继续以检查元素是否存在。

你的代码逻辑应该是这样的:

List<WebElement> element = driver.findElements(By.xpath("mention the xpath of the element that needs to be found"));
boolean elementLoaded = false;
int swipeCount = 0;
// Taking the swipeCount limit as 5 here
while (!elementLoaded && swipeCount < 5) {
    if (element.size() == 0) {
        // Swipe the screen
        swipe(driver);
        swipeCount++;
    } else {
        elementLoaded = true;
    }
}
return elementLoaded;

【讨论】:

  • 我对您的方法唯一担心的是您将滑动计数限制为 5。我们的实现与您的类似,但它在应该在 8 次滑动后加载元素的屏幕上失败了。因此,我想将其更改为动态的。
  • 我能够摆脱读取屏幕上所有元素的步骤。现在我可以直接读取屏幕上的最后一个元素。 MobileElement lastElement = this.driver.findElement(By.xpath("//*[last()]"));现在问题出在这一行 - if (lastElementAfterSwipe.equals(lastElement)) 它总是返回 true,即使在调试时,我可以看到这两个元素是不同的。
  • 您可以根据您的要求更改滑动次数,为了安全起见,您也可以将其设为 10,但您可以确定如果测试用例通过了该元素,但是如果即使页面上有一些新的和不受欢迎的元素,您也可以按照您的方法进行测试。
  • 而在您现在采用的新方法中,您只需滑动一次即可检查新元素是否不同,但可能存在这样一种情况,即在 3-4 次滑动之后,该元素是应该出现的没有出现,因此您必须定义一些滑动次数以实际在页面上出现所需的元素。
  • 很遗憾,我没有提到上面的方法是从一个while循环中调用的。所以,这里是整个逻辑。检查元素是否存在,而不是从 while 循环内部调用上述方法(请注意,上述方法正在调用一个在屏幕上滑动的方法)。如果在滑动后加载了一个新元素,那么就有机会找到我正在寻找的元素。因此,在原始的 while 循环中,再次检查是否找到了所需的元素。如果已找到,则退出 while 循环。如果找不到,则再次调用上述方法以检查滚动是否加载新的。
猜你喜欢
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
相关资源
最近更新 更多