Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
来源:互联网 发布:周五非农就业数据 编辑:程序博客网 时间:2024/06/05 08:36
经过前面两篇文章的铺垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题。我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的tab窗口打开页面B,这个时候,你在页面B点击一个连接,会在新的tab窗口打开页面C。这种情况,在测试中经常遇到,自动化中,webdriver是如何处理的呢。
我们先来看一个实例,在京东首页,点击手机,会在新的页面显示手机通讯的页面,在手机页面点击小米,会在新的窗口打开显示小米手机的页面。这个过程,刚好是页面A到页面B再到页面C。我们先抛开其他的,就是先实现driver在页面A切换到页面B,然后切换到页面C这个过程如何实现,在webdriver中提供了一个switch.to.window(handle)的方法。参数handle就是前面文章中提到的获取窗口句柄的值。
相关代码如下:
package lessons;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Set;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;public class ElementOpration {public static void main(String[] args) throws Exception { System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("https://www.jd.com/"); Thread.sleep(1000); //点击京东左侧菜单中的 手机 WebElement phone_link = driver.findElement(By.linkText("手机")); phone_link.click(); Thread.sleep(1000); // 获取当前页面句柄 String handle = driver.getWindowHandle(); // 获取所有页面的句柄,并循环判断不是当前的句柄 for (String handles : driver.getWindowHandles()) { if (handles.equals(handle)) continue; driver.switchTo().window(handles); } WebElement xiaomi_link = driver.findElement(By.linkText("小米")); xiaomi_link.click(); Thread.sleep(1000); } }上面在获取handles过程写了一个for循环,for循环的句柄和当前driver的句柄相等,那么就continue,也就是结束单循环,什么也不做。如果不是,那么就调用切换窗口的方法,切换到第二个窗口。到了这里,可能有人就会提出,如果我需要第二个切换到第三个呢,假如说,在判断第三个句柄不等于第二个,那么driver会不会默认切换到第三个窗口还是切换到第一个呢。如果真要这么做,需要用到ArrayList,然后用到迭代,可能稍微变得复杂。为了避免这种复杂情况出现,我推荐这样做,只需要把上面代码中的continue语句改成driver.close(),前面文章介绍过,close是关闭当前页面。如果是页面A点击链接打开页面B,那么这个过程关闭的就是页面A,同时把driver切换到页面B。如果有第三个,从第二个页面到第三个页面也是用这样切换方法。这里永远就两个页面之间处理的关系。一般来说,自动化也是尽量在一个页面做完相关测试,才会切换到其他页面。
修改后脚本代码如下:
package lessons;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Set;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.chrome.ChromeDriver;public class ElementOpration {public static void main(String[] args) throws Exception { System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("https://www.jd.com/"); Thread.sleep(1000); //点击京东左侧菜单中的 手机 WebElement phone_link = driver.findElement(By.linkText("手机")); phone_link.click(); Thread.sleep(1000); // 获取当前页面句柄 String handle = driver.getWindowHandle(); // 获取所有页面的句柄,并循环判断不是当前的句柄 for (String temhandle : driver.getWindowHandles()) { if (!temhandle.equals(handle)) driver.close(); driver.switchTo().window(temhandle); } WebElement xiaomi_link = driver.findElement(By.linkText("小米")); xiaomi_link.click(); Thread.sleep(1000); } }上面实现了页面A,切换到页面B,同时关闭页面A,页面B点击触发页面C,这个过程还需要用for循环判断一次。所以关于这块,我建议你单独写成一个方法,例如静态方法,直接调用这个,就代码看起来很舒服。关于这个,后面我们会介绍,框架设计部分,肯定要写不同的方法进行调用。
阅读全文
0 0
- Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
- Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
- WebDriver切换浏览器窗口
- WebDriver切换浏览器窗口
- WebDriver切换浏览器窗口
- WebDriver切换浏览器窗口
- WebDriver切换浏览器窗口
- selenium(java)浏览器多窗口切换处理
- Selenium自动化:WebDriver切换浏览器窗口(选项卡)方法
- webdriver 多窗口切换
- Java+Selenium3方法篇23-iframe切换的问题
- Java+Selenium3方法篇19-获取浏览器窗体的句柄
- Webdriver学习笔记(六)多窗口的切换处理
- Java+Selenium3方法篇26-处理Alert弹窗
- Java+Selenium3方法篇32-处理不安全连接
- Java+Selenium3方法篇34-如何处理日历控件
- Java+Selenium3方法篇37-Robot类处理文件上传
- Java+Selenium3方法篇38-AutoIt工具处理文件上传
- node 中的buffer操作
- 主存-辅存结构存储体系(页式虚拟存储器)与Cache-主存结构存储体系的不同
- 6.22-6.27 JLL--实习日志--Ajax+js 端实现
- 二叉树遍历、根据先序中序还原
- 设计电子琴的C语言程序(基于单片机)
- Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
- 一天搞懂机器学习PPT笔记-2
- 【BUG笔记】Visual Studio中“无法启动程序,系统找不到指定的文件”的解决办法
- Android之简单布局LinearLayout和RelativeLayout
- leetcode 260. Single Number III
- ES6入门(Proxy和Reflect,类和对象,Promise,Lterator,Genertor,Decorators,模块化)
- Highcharts添加滚动条的方法
- 利用键盘钩子捕获Windows键盘动作(补充)
- BBS论坛留言板servlet+jsp+jdbc+mysql