Appium 测试 Android 混合应用时,第二次切换到WebView时的定位问题

测试混合应用切换到Webview模式时经常会遇到找不到当前页面元素,打印出来pagesoure,发现还停留在之前的页面上。这其实是网页多窗口的问题,就像在Web页面上,点击一个超链接,不是在原来页面的基础上打开页面,而是又开了一个新的窗口,原来的页面还是存在的。测试混合应用的Webview,其实就是测试web页面。既然是这样,我们指定切换到当前页面,然后在获取该页面的元素就OK了。具体实现如下:
把Appium 或者 Android driver 切换成web方式的driver,切换到webview模式即可。
然后获取所在页面的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();

}
}
}

这里是获取当前页面的handle,然后切换到指定handle,还有另一种方式,切换到指定index,比如5个窗口,切换到第一个index是0,切换到第5个,index是4。

webDriver.switchTo().window((String) windows.toArray()[windows.size() - 1])

Katalon Studio中有个方法是:

WebUI.switchToWindowIndex(4)

不过不推荐使用这种方式,有时候页面不稳定,不会切换到指定的页面。

参考:selenium 多窗口切换(windows)

猜你喜欢

转载自blog.csdn.net/xuecancan/article/details/79990562