首页 > selenium--driver.switchTo()

selenium--driver.switchTo()

在自动化测试中,会遇到多窗口、多iframe、多alert的情况。此时,会使用driver.switchTo()来解决。

下面时关于driver.switchTo()的详细介绍:

1.多windows操作。

在页面A上操作时,点击某个元素之后,可能会打开新的窗口。如果需要操作新窗口上的元素,进必须跳转到新的窗口上。

    @Testpublic void fTest() throws InterruptedException {//launchBrowser是自己封装的方法 ,主要是为了启动浏览器驱动,打开指定url,页面加载的等待超时时间设置为3S

     //这里测试使用的是qq邮箱的登录页面
launchBrowser("https://mail.qq.com/cgi-bin/loginpage", 3);//定位并点击“手机版”元素,打开手机版页面,此时会打开新的窗口driver.findElement(By.partialLinkText("手机版")).click();Thread.sleep(3000);//获取当前窗口句柄(此时是获得https://mail.qq.com/cgi-bin/loginpage页面的句柄)String currentHandle = driver.getWindowHandle();//获得所有的窗口句柄,如果不是currentHandle,则进入Set windowHandles = driver.getWindowHandles();for (String windowHandle : windowHandles) {if (!currentHandle.equals(windowHandle) ) {//进入到手机版页面的窗口 driver.switchTo().window(windowHandle);}}//此时才能操作手机版页面的元素driver.findElement(By.cssSelector("a[href='http://app.mail.qq.com/cgi-bin/appdownload?check=false&stype=1&subtype=8&fr=&url=ios&downloadclick=']")).click();;

      //如果想要操作qq邮箱登录页面的元素,此时需要退回到之前的窗口

      driver.switchTo().window(currentHandle);

         }

上面是通过switchTo()方法,进入新的页面,并操作对应元素。

还有另为一种方式:

手机版

我们点击链接之后,打开新的窗口,就是因为这个链接中有属性 target="_blank"

所以,我们可以通过JQuery脚本来去除该元素的target的属性。去除之后再点击的时候,就不会打开新的浏览器窗口了。

这个qq邮箱的页面http://app.mail.qq.com/,首次执行JQuery会失败,第二次会成功。猜测可能是因为第一次执行之后,会触发引入jQuery的操作。为了使代码具有通用性,直接引入jQuery。

但是很多安全性高一些的网站,会限制引入的域名地址。会造成引入JQuery失败。为了解决该问题,教大家一个万能的方法:下载某页面的JQuery源代码,放到本地文件中。封装读取并执行JQuery的帮助类。

帮助类代码:

package com.claire.jing.utils;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;import org.openqa.selenium.JavascriptExecutor;public class ImportJQueryUtil {public static void importJQueryUtil(JavascriptExecutor jse) {StringBuffer buffer = new StringBuffer();FileInputStream inputStream = null;try {inputStream = new FileInputStream("F:\开发资料\jQuery源码\jquery-1.10.2.min.js");} catch (FileNotFoundException e) {// TODO Auto-generated catch block
            e.printStackTrace();}InputStreamReader reader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(reader);String temp=null;try {while ((temp = bufferedReader.readLine()) !=null) {buffer.append(temp);}} catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();}jse.executeScript(buffer.toString());}}

使用JQuery来删除元素指定属性

@Testpublic void fTest() throws InterruptedException {//方式2:使用JQuery来删除target="_blank"//launchBrowser是自己封装的方法 ,主要是为了启动浏览器驱动,打开指定url,页面加载的等待超时时间设置为3SlaunchBrowser("https://mail.qq.com/cgi-bin/loginpage", 20);//该js脚本判断是否引入了JQueryString js = "return (typeof($)=="undefined")";boolean flag = (boolean)((JavascriptExecutor)driver).executeScript(js);//如果没引入,则调用帮助类,执行JQuery源码。//这里之所以不使用直接增加Script节点引入JQuery,是因为很多安全性高一些的网站,会限制引入的域名地址。会造成引入JQuery失败if (flag) {ImportJQueryUtil.importJQueryUtil((JavascriptExecutor)driver);            }//这里可以判断下,是否引入成功了//System.out.println((boolean)((JavascriptExecutor)driver).executeScript(js));//http://app.mail.qq.com/" target="_blank">手机版//该a链接带有属性target="_blank"--拥有该属性的链接,点击后才会打开新的页面。只要通过js来移除该属性,点击之后,就不会打开新的浏览器窗口了String jquery = "var com=$('a[href="http://app.mail.qq.com/"]');"+ "com.removeAttr("target");"+ "com[0].click();";((JavascriptExecutor)driver).executeScript(jquery);//观察一下执行结果Thread.sleep(4000);quit();}

2.Iframe

有些页面元素时包在IFrame中的,此时想要操作Iframe上的元素,必须先进入Iframe里面去。

 下面举例多层iframe嵌套的情况:

    @Testpublic void fTest() throws InterruptedException {launchBrowser("http://XXX/index.html", 10);//为了不需要每次都登录,可以设置添加cookie()driver.manage().deleteCookieNamed("JSESSIONID");driver.manage().addCookie(new Cookie("qqq", "BD04BA5FA2019D6C9DB28E25A5B14D85"));try {//为了cookie使用的久一些,可以设置cookie的有效期。//即使这里设置了cookie有效期,cookie也是有可能会无效的(一般情况下,会将sessionId存到cookie中)://第一:服务端的session是有有效期的,如果session过期了,那么这个cookie也就无效了。//第二,当服务端的内存报警时,就可能会清除session。这种情况下,你的cookie也会失效//第三,当服务端重启之后,缓存和session都会清空的,你的cookie自然就失效了driver.manage().addCookie(new Cookie("JSESSIONID", "FB9F06DDF0D15C491EFAD6D444893F80","/lmcanon_web_auto",(new SimpleDateFormat("yyyy-MM-dd hh:m:ss")).parse("2018-12-12 12:12:12") ));} catch (ParseException e) {logger.error("日期转换出错");e.printStackTrace();}driver.get("http://XXX/index.html");logger.info("成功打开首页");driver.findElement(By.cssSelector("i[class="Hui-iconfont menu_dropdown-arrow"]")).click();logger.info("成功定位习题管理,并点击");//定位习题管理子标签,该标签是需要点击父标签习题管理之后,才会可见的。//下面使用了ExpectedConditions中提供的visibilityOfElementLocated()来判断该字标签是否可见,可见之后才对其进行点击操作WebDriverWait wait = new WebDriverWait(driver, 3);            wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("a[data-href="stem-list.html"]"))).click();logger.info("成功定位子元素习题管理并点击");//想要点击“添加习题”按钮,发现该按钮在iframe中,必须先进入iframe才能定位并操作该元素WebElement IframeElement = waitElement(By.cssSelector("iframe[src='stem-list.html']"));driver.switchTo().frame(IframeElement);logger.info("成功进入第一层Iframe,并进入");driver.findElement(By.cssSelector("a[class="btn btn-primary radius"]")).click();logger.info("成功定位第一层frame内的添加习题按钮并点击");//嵌套iframe情况,想要点击添加习题弹窗上的元素,就必须进入第二层iframe//进入第二层Iframe//首先定位第二层iframe WebElement iframe2 = driver.findElement(By.id("layui-layer-iframe2"));driver.switchTo().frame(iframe2);logger.info("成功进入第二层iframe");//定位第二层iframe的元素//WebElement subjectType = driver.findElement(By.cssSelector("select[name="subjectType"]"));Select select = new Select(subjectType);select.selectByIndex(2);logger.info("成功定位第二层iframe内的题目领域元素,并选择为mysql数据库");//退出当前iframe-----注意:下面方法是退回到的top window 层
        driver.switchTo().defaultContent();logger.info("成功退回到first frame.");//操作topWindow上的元素,证明成功退回driver.findElement(By.cssSelector("i[class="Hui-iconfont menu_dropdown-arrow"]")).click();logger.info("成功定位习题管理,并点击");}

 

3.alert操作

其实现在前台系统中的alert页面越来越少了。因为它的体验不是很好。但是在一些后台系统中,还是会遇到alert操作。Alert弹窗分三种,Alert,prompt(需要输入内容的弹窗),confirm



1. alert() 弹出个提示框 (确定) 

警告消息框 alert 方法有一个参数,即希望对用户显示的文本字符串。该字符串不是 HTML 格式。该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说,用户必须先关闭该消息框然后才能继续进行操作。

 

2. confirm() 弹出个确认框 (确定,取消) 

确认消息框 使用确认消息框可向用户问一个“是-或-否”问题,并且用户可以选择单击“确定”按钮或者单击“取消”按钮。confirm 方法的返回值为 true 或 false。该消息框也是模式对话框:用户必须在响应该对话框(单击一个按钮)将其关闭后,才能进行下一步操作。

 

3. prompt() 弹出个输入框(确定,取消)。

如果用户单击提示框的取消按钮,则返回 null。如果用户单击确认按钮,则返回输入字段当前显示的文本。

在用户点击确定按钮或取消按钮把对话框关闭之前,它将阻止用户对浏览器的所有输入。在调用 prompt() 时,将暂停对 JavaScript 代码的执行,在用户作出响应之前,不会执行下一条语。

 

    @Testpublic void fTest() throws InterruptedException {launchBrowser("D:\javascript\Untitled-3.html", 10);WebDriverWait wait = new WebDriverWait(driver, 3);Alert alert2 = wait.until(ExpectedConditions.alertIsPresent());System.out.println(alert2.getText());//取消alert2.dismiss();//确定alert2.accept();//输入内容alert2.sendKeys("hello");Thread.sleep(4000);        }

 

转载于:https://www.cnblogs.com/clairejing/p/9499223.html

更多相关:

  • 栈stack:stack 后入先出(LIFO) q.top()获取栈顶元素(并不删除)q.pop()删除栈顶元素q.push(x)向栈中加入元素q.empty()判断栈是否为空 队列queue:先入先出(FIFO)   q.front()获取队首元素(并不删除)q.pop()删除队首元素q.push(x)向队列中加入元素q....

  • resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:正在建造的一辆公交车,车里面可以设置40个座椅(reserve(40);),这是它的容量,但并不是说它里面就有了40个座椅,只能说...

  • v-for="(index,$i) in total" :key="$i":style="{left:`${itemWidth*((index-1)%rowItemCount)}px`,top:`${itemHeight*(Math.ceil(index/rowItemCount)-1)}px`}" //total是显示总数量 //l...

  •   技巧一(推荐指数★★★★★) 采用top、right、bottom、left,可以不在乎父元素的宽度和高度,对GPU损耗低于技巧三,但是对浏览器内存的消耗高于技巧三 .子元素 {/*父元素需要position: relative|absolute;*/position: absolute;margin: auto;to...

  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例: MinStack minStack = new MinStack(); minStack...

  • 一次手贱更新了上面这个驱动,结果: Fn+F2/F3不能控制亮度win+X弹出来的下面这个窗口“显示器亮度”不见了 电源选项里面底部“屏幕亮度”也不见了 我研究了三天,各种骚操作都试过了,最后找到解决方案: win+R 输入 devmgmt.msc 回车,按照下图操作,瞬间亮度恢复正常 ...

  • 第一种:需要刷新当前页面重复执行的操作——使用场景:刷点击率 、秒杀活动、抢沙发   //自动化循环操作方法 var doLoop = function (dom) {dom || (dom = document);//这里写循环操作的代码dom.querySelector("sel").innerHTML = "舒工的骚操作!!...

  • Ubuntu常用操作外观操作修改应用icon图标终端美化内存管理内存查询分区管理日志清理操作执行自动执行多条命令...

  • 文章目录前言工业级 LRU Cache1. 基本架构2. 基本操作2.1 insert 操作2.2 高并发下 insert 的一致性/性能 保证2.3 Lookup操作2.4 shard 对 cache Lookup 性能的影响2.4 Erase 操作2.5 内存维护3. 优化...

  • 最近利用vim做一些文本处理时 发现vim 支持的键盘宏是一个好东西啊,高效优雅得处理大量需要重复性操作的文本,让人爱不释手!!! 希望接下来对键盘宏的分享能够实际帮助到大家。 后文中描述的一些vim操作会汇集成指令字符串,方便大家参考。 1. 场景描述 在分享键盘宏之前,先看这样一个文本操作需求: 对如下文本增加ma...

  • 我这里已经简单的创建了一个文件,为了浅显易懂,这里程序写的比较简单 1.      运行程序 首先,找到编辑窗口上面有一个向下方向的灰色箭头,点击它 点击之后,选择第一个选项edit Configurations,然后在弹出的窗口的第一栏name栏取一个你想要的名字,接着在第二栏Script栏后面点击后面的…选择你刚刚...

  • 1、选择 Help Install New Software; 2、在Details 面板中, 点击What is already installed? 链接; 3、在Eclipse Installation Details 对话框中,选择Android DDMS和Android Development Tools ,然后点击Uni...

  • 八、资产管理和远程管理前面已经完成了SCCM的部属及配置,客户机也安装好了客户端软件。现在我们可以利用SCCM对客户机实施管理了,接下来我们看一下SCCM的资产管理和客户端远程管理能力。1、智能资产管理资产管理分为硬件资产管理和软件资产管理。硬件资产管理主要是查询客户机的硬件配置,例如CPU,内存,硬盘等。软件资产管理主要是查询客户...

  • 为什么竞价点一下词要收这么多钱?大家是否考虑过这个问题。竞价后台花费有一定的误区假如某关键词点击价格为1元,如果经过调整以后,每次点击只要6角钱,这个词每天的流量是1000次,那么每天这个关键词就节约了400元。如何降低点击的费用,达到我们节约费用的目的。有的人对就想竞价只是花钱而已,不会赚什么钱,其实这是错误的看法,原因是你并没有...

  • 原文地址:http://www.cnblogs.com/tc310/archive/2010/05/08/1730300.html http://www.kucol.com/html/NEws/yejie/20091022/4178.htmlDelphi 2010 3513正式 一、下载ISO文件右键迅雷下载二、安装完成后,先运行一下...