【问题标题】:Cannot click the element after swipe in appium在appium中滑动后无法单击元素
【发布时间】:2017-01-29 04:17:55
【问题描述】:

我在亚马逊购物应用上进行了测试。滑动查找元素后出现问题。 因为列表视图太长了。我需要滚动(使用滑动 API)。但是在我滑动之后,我不能再点击该元素了。它没有返回错误,但应用程序没有响应。

ScrollToElement() 函数是滑动到搜索元素。我尝试使用触摸动作点击但没有希望。我试图点击一个精确的(372,466)位置,它可以工作,但并不像预期的那样。提前致谢。

public class FirstTest {
   private AppiumDriver driver;
   private   Dimension size;

   @BeforeClass
   public void Setup() throws MalformedURLException {


      String appActivityText = "com.amazon.mShop.home.HomeActivity";


      String appPackageText = "in.amazon.mShop.android.shopping";

      String fileLocation = "/system/app/";

      File classpathRoot = new File(System.getProperty("user.dir"));
      File appDir = new File(classpathRoot, "\\STC");
      File app = new File(appDir, fileLocation);
      System.out.println(app);
      DesiredCapabilities capabilities = new DesiredCapabilities();

      capabilities.setCapability("device", "Android");
      capabilities.setCapability(CapabilityType.BROWSER_NAME, "Android");

      capabilities.setCapability(CapabilityType.PLATFORM, "Android");

      capabilities.setCapability(CapabilityType.VERSION, "4.4.2");

      capabilities.setCapability("deviceName", "420373d0de528100");//420373d0de528100 01a61316598f30e6

      capabilities.setCapability("newCommandTimeout", "100");

      // capabilities.setCapability("app", "Chrome"/*app.getAbsolutePath()*/);

      capabilities.setCapability("appPackage", appPackageText);

      capabilities.setCapability("appActivity", appActivityText);

      driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
      driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);

   }

   @Test
   public void Login() throws Exception {
      // Click on Shop by Deparment link
      driver.manage().timeouts().implicitlyWait(80, TimeUnit.SECONDS);
      System.out.println("Click on Shop by Deparment link");
      driver.findElement(By.id("web_home_shop_by_department_label")).click();
      Thread.sleep(1000);

      WebElement element = driver.findElement(By.name("Office Products Link"));
      ScrollToElement(driver, element);

      Thread.sleep(3000);
//      TouchAction action = new TouchAction(driver);
//      action.tap(372,466).perform();

      driver.findElement(By.name("Office Products Link")).click();

   }
   @AfterClass
   public void closeApp() {
      // driver.closeApp();

   }

public static void ScrollToElement(AppiumDriver driver, WebElement element){
      size = driver.manage().window().getSize();

      // Find swipe start and end point from screen's with and height.
      // Find starty point which is at bottom side of screen.
      int start = (int) (size.height * 0.20);
      int starty = (int) (size.height * 0.80);
      // Find endy point which is at top side of screen.
      int endy = (int) (size.height * 0.20);
      // Find horizontal point where you wants to swipe. It is in middle of
      // screen width.
      int startx = size.width / 2;

      while (true) {
         driver.swipe(startx, starty, startx, endy, 3000);
         start = start + (starty - endy);
         if (element.getLocation().getY() - start < size.height - endy) {
            break;
         }
      }
   }
}

【问题讨论】:

    标签: java android selenium appium


    【解决方案1】:

    您的代码的问题是您错误地使用了driver.findElement。 让我解释。 driver.findElement 检查屏幕上呈现的元素,如果找到,则返回。

    你的代码的问题是你在滚动函数之前做了driver.findElement,这意味着如果元素当前不在屏幕上,测试总是会失败。

    这个代码块应该可以帮助你:

    public WebElement findItemWithScrollingUsingBy(By by, int interactions) {
        for (int i = 0; i < interactions; i++) {
            if (driver.findElements(by).size() == 0) {
                scrollDown();
            } else {
                return driver.findElement(by); //you can add .click() here instead of returning the element
            }
        }
        Assert.fail("Element not found");
        return null;
    }
    

    函数scrollDown()只是将滑动的代码块带到外部函数中,这样更干净。

    总结一下我的回答:

    1. 在屏幕上搜索元素 - 如果找到,请点击
    2. 如果未找到 - 进行另一个滚动操作并再次搜索该元素
    3. 重复

    【讨论】:

    • 其实。我要查找的元素已经出现,但它位于列表视图的底部。我使用 API getsize()、driver.findElement(By.name("Office Products Link")).getsize()。它返回了一个值。但我也无法单击该元素。因此,我尝试滚动屏幕​​来呈现元素。我对此一无所知,但感谢您的帮助
    • 如果元素位于屏幕底部,则需要在找到该元素后再次滚动。您可以做的是 - slowScroll() starty = ... * 0.6 endy = ... * 0.4 。滚动后,该项目将位于屏幕中间 - 准备好被点击。您还可以使用元素的坐标在元素的顶部执行 tap()。但首先让我们试试这个。
    • 谢谢大卫,但我是 appium 的新手。 “使用其坐标在元素的顶部执行tap()”是什么意思?你能指导我吗?
    • 额外的卷轴不起作用? driver.tap(1,x,y,1) 是一个使用坐标点击屏幕的函数。所以,像这样获取元素的坐标:高度:int y = element.getRect().getY() 元素中间:int x = element.getRect().getX() + element.getRect().getWidth()/2,现在driver.tap(1,x,y+10,1) // + 10 pixels so the coordinate is inside the element 表示您将在元素顶部的中间点按。
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2021-04-04
    • 2020-05-22
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多