Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换
经过前面两篇文章的铺垫,我们这篇介绍,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循环判断一次。所以关于这块,我建议你单独写成一个方法,例如静态方法,直接调用这个,就代码看起来很舒服。关于这个,后面我们会介绍,框架设计部分,肯定要写不同的方法进行调用。 --------------------- 本文来自 Anthony_tester 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u011541946/article/details/73611301?utm_source=copy
原文:https://blog.csdn.net/u011541946/article/details/73611301
Java+Selenium3方法篇21-webdriver处理浏览器多窗口切换的更多相关文章
- Java+Selenium3方法篇24-单选和多选按钮操作
Java+Selenium3方法篇24-单选和多选按钮操作 本篇介绍 webdriver处理前端单选按钮的操作.单选按钮一般叫raido button,就像我们在电子版的单选答题过程一样,单选只能点击 ...
- 《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)
1.简介 上一篇讲解和分享了如何获取浏览器窗口的句柄,那么今天这一篇就是讲解获取后我们要做什么,就是利用获取的句柄进行浏览器窗口的切换来分别定位不同页面中的元素进行操作. 2.为什么要切换窗口? Se ...
- webdriver实现简单的窗口切换
webdriver实现简单的窗口切换,也只能是简单的,因为目前处于学习阶段,复杂的情况现在还没碰到过.之前写过关于一个小demo的总结,就有提到过在新开窗口进行操作的情况,用以下一句就可以搞定了,la ...
- Python模拟浏览器多窗口切换
# 模拟浏览器多窗口切换 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要对应版本的Chro ...
- js监听浏览器tab窗口切换
js监听浏览器tab窗口切换 ——IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) { document.addEventLis ...
- selenium2-java 浏览器不同窗口切换
1,获取浏览器的单个窗口: String parentWindowid = driver.getWindowHandle(); System.out.println( ...
- selenium(java)浏览器多窗口切换处理
要在多个窗口直接切换,首先获取每个窗口的唯一标示符(句柄),通过窗口属性可以获取所有打开窗口的标示符,以集合的形式返回:以下示例: Set<String> winHandels ...
- web自动化之浏览器的窗口切换
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...
- Python3+Selenium2完整的自动化测试实现之旅(四):Selenium-webdriver操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换
本篇学习总结webdriver模块操作浏览器.Cookie.鼠标键盘.警示框.设置等待时间.多窗口切换等方法的使用 1 浏览器控制 Selenium-webdriverAPI提供了对页面元素定位 ...
随机推荐
- vue-cli2 打包
npm run build 打包安装 相当于静态资源 解决vue-cli项目打包出现空白页和路径错误的问题 路径错误的问题解决方式: 打开config文件夹下的 index.js 找到如下图所示区域: ...
- Python网络编程基础 ❶ 计算机网络基础 初用socket模块
1.计算机网络基础 C/S 客户端/服务器端 B/S 浏览器端/服务器端 mac地址,ip地址,子网掩码,与计算得到网段,端口号每台计算机的网卡都有全球唯一的地址,在生产时已经写进去了. ip地址 ...
- 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)
设阈值 考虑对于询问的\(d\)设阈值进行分别处理. 对于\(d\le\sqrt{max\ d}\)的询问,我们可以\(O(n\sqrt{max\ d})\)预处理答案,\(O(1)\)输出. 对于\ ...
- asp.net mvc 系统操作日志设计
第一步.系统登录日志 通过signalr来管理用户的登录情况,并保存用户的登录记录. 第二步 通过mvc过滤器,来横切路由访问记录. 保存方式:通过httpclient异步请求webapi 数据通过m ...
- 【08月20日】A股滚动市净率PB历史新低排名
2010年01月01日 到 2019年08月20日 之间,滚动市净率历史新低排名. 上市三年以上的公司,2019年08月20日市净率在30以下的公司. 来源:A股滚动市净率(PB)历史新低排名. 1 ...
- 从零到一手写基于Redis的分布式锁框架
1.分布式锁缘由 学习编程初期,我们做的诸如教务系统.成绩管理系统大多是单机架构,单机架构在处理并发的问题上一般是依赖于JDK内置的并发编程类库,如synchronize关键字.Lock类等.随着业务 ...
- Django学习笔记(17)——BBS+Blog项目开发(1)验证码功能的实现
本文主要学习验证码功能的实现,为了项目BBS+Blog项目打下基础. 为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是“Com ...
- WPF 3D相机基本坐标简介
基本概念 WPF中3D空间基本坐标系是右手坐标系. WPF中3D空间的原点是(0,0,0) Position: 这个参数用来表示相机在空间内的坐标.参数是(X,Y,Z).当修改相机的这个参数时,这个坐 ...
- OpenJDK下SpringBoot使用HttpSession时页面打开卡住
近期将一个老项目向ARM版的CentOS7移植时,遇到了SpringBoot启动顺利,但访问页面卡住的问题.由于是aarch64架构,因此使用了openjdk,这个项目之前在x86_64环境下一直是用 ...
- Python破解js加密实例(有道在线翻译)
在爬虫爬取网站的时候,经常遇到一些反爬虫技术,比如: 加cookie,身份验证UserAgent 图形验证,还有很难破解的滑动验证 js签名验证,对传输数据进行加密处理 对于js加密经过加密传输的就是 ...