Appium测试 Android 混合应用时的定位问题

发表于:2018-12-28 14:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Cara69    来源:CSDN

  概述
  测试混合应用切换到Webview模式时经常会遇到找不到当前页面元素,打印出来pagesoure,发现还停留在之前的页面上。这其实是网页多窗口的问题,就像在Web页面上,点击一个超链接,不是在原来页面的基础上打开页面,而是又开了一个新的窗口,原来的页面还是存在的。测试混合应用的Webview,其实就是测试web页面。既然是这样,我们指定切换到当前页面,然后在获取该页面的元素就OK了。下面提供三种方式切换到指定页面,推荐使用第三种,根据 title 切换。
  1. 根据 handle 值切换
  思路如下:
  1. 把Appium 或者 Android driver 切换成web方式的driver,切换到webview模式即可。
  2. 然后获取所在页面的windowdanle(可以看成一个窗口的编号),然后使用指定方法切换到当前窗口。
  以下代码是以新浪网为实例。通过获取句柄切换到指定窗口,并关闭窗口。当然切换到指定窗口,也可以通过元素定位等方法对元素进行操作。
  getWindowHandle():获得当前窗口句柄。
  getWindowHandles():返回的所有窗口的句柄到当前会话。
  switchTo().window():用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切
  换,后者用于不同表单之间的切换。
   public static void main(String[] args) throws InterruptedException {
  System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");
  ChromeOptions Options = new ChromeOptions();
  Options.addArguments("user-data-  dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");
  WebDriver driver = new ChromeDriver(Options);
  driver.manage().window().maximize();
  // 窗口最大化
  driver.get("http://www.sina.com.cn/");
  driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
  // 设置元素等待时间 ,隐式等待
  String sreachHand = driver.getWindowHandle();
  // 获取当前窗口的句柄
  driver.findElement(By.linkText("体育")).click();
  // 打开新浪官网上的体育链接
  driver.findElement(By.linkText("娱乐")).click();
  // 打开新浪官网上的娱乐链接
  java.util.Set<String> Handles = driver.getWindowHandles();
  System.out.println(Handles.size() + "集合长度");
  // 获取所有窗口的句柄并将句柄放在Set集合中。
  // 以下判断是否是新浪网首页,如果是则关闭新浪网首页。
  for (String i : Handles) {
  if (i.equals(sreachHand)) {
  driver.switchTo().window(i);
  Thread.sleep(5000);
  driver.close();
  }
  }
  }
  2. 根据 Index 切换
  第一种方法是获取当前页面的handle,然后切换到指定handle,还有另一种方式,切换到指定index,比如5个窗口,切换到第一个index是0,切换到第5个,index是4。
  webDriver.switchTo().window((String) windows.toArray()[windows.size() - 1])
  Katalon Studio中有个方法是:
 WebUI.switchToWindowIndex(4)
  不过不推荐使用这种方式,有时候页面不稳定,不会切换到指定的页面。这种方式适合根据index比较少的windows切换。下面会介绍一种比较精确的方式。
  3. 根据title切换到指定窗口
  具体实现代码如下:
   public boolean switchToWindow(WebDriver driver,String windowTitle){
  boolean flag = false;
  try {
  String currentHandle = driver.getWindowHandle();
  Set<String> handles = driver.getWindowHandles();
  for (String s : handles) {
  if (s.equals(currentHandle))
  continue;
  else {
  driver.switchTo().window(s);
  if (driver.getTitle().contains(windowTitle)) {
  flag = true;
  System.out.println("Switch to window: "
  + windowTitle + " successfully!");
  break;
  } else
  continue;
  }
  }
  } catch (NoSuchWindowException e) {
  System.out.println("Window: " + windowTitle
  + " cound not found!", e.fillInStackTrace());
  flag = false;
  }
  return flag;
  }
  可以通过 chrome浏览器查看打开了几个窗口,如下图:
  如果想切到商品详情页,直接传入”商品详情页”,调用上面的方法即可。这种方式还是比较好用的。Katalon Studio 中有封装的好的函数,直接使用即可。
     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号