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

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

1.多windows操作。

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

@Testpublic void fTest() throwsInterruptedException {//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<String> 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()方法,进入新的页面,并操作对应元素。

还有另为一种方式:

<a href="http://app.mail.qq.com/" target="_blank">手机版</a>

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

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

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

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

帮助类代码:

packagecom.claire.jing.utils;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStreamReader;importorg.openqa.selenium.JavascriptExecutor;public classImportJQueryUtil {public static voidimportJQueryUtil(JavascriptExecutor jse) {StringBuffer buffer= newStringBuffer();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= newInputStreamReader(inputStream);BufferedReader bufferedReader= newBufferedReader(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() throwsInterruptedException {//方式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));//<a href="http://app.mail.qq.com/" target="_blank">手机版</a>//该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() throwsInterruptedException {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 <iframe scrolling="auto" allowtransparency="true" id="layui-layer-iframe2" name="layui-layer-iframe2" οnlοad="this.className='';" class="" frameborder="0" src="./stemAndItem-add.html" style="height: 467px;"></iframe>WebElement iframe2 = driver.findElement(By.id("layui-layer-iframe2"));driver.switchTo().frame(iframe2);logger.info("成功进入第二层iframe");//定位第二层iframe的元素//<select class="select valid" name="subjectType" aria-required="true" aria-invalid="false"><option value="0">--请选择--</option><option value="1">软件测试基础</option><option value="2">mysql数据库</option><option value="3">linux</option><option value="4">java</option></select>WebElement subjectType = driver.findElement(By.cssSelector("select[name=\"subjectType\"]"));Select select= newSelect(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

selenium--driver.switchTo()相关推荐

  1. selenium driver.find_element 报错 invalid argument: invalid locator

    selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator 报错信息 ...

  2. Safari中安装selenium driver

    开发十年,就只剩下这套Java开发体系了 >>>    SafariDriver下载地址: http://www.seleniumhq.org/download/ 一.安装safar ...

  3. Selenium Webdriver——操作隐藏的元素(三)switchTo().frame()

    在web 应用中经常会遇到frame 嵌套页面的应用,页WebDriver 每次只能在一个页面上识别元素,对 于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的.这个时候就需要通过swit ...

  4. python+selenium自动化driver.switch_to.frame用法

    1.为什么需要有frame? 因为一个页面如果只有一个html,所有内容都要用表格来分是很难而且很丑,所以引进了frame可以将左侧树.右侧内容,顶端导航轻松分开. 那么我们也有应对的方法就是要操作哪 ...

  5. web driver selenium 操作滚动条

    方法一:调过JS脚本控制 #coding=utf-8 from selenium import webdriver import time #访问百度 driver=webdriver.Firefox ...

  6. 你需要知道的有关Selenium异常处理的都在这儿

    什么是异常? 顾名思义,作为程序员的一种常用术语,"异常"与任何特定的编程语言无关.它属于程序因为突然中止,而未能交付出预期输出的事件.通常,引发异常出现的潜在因素往往来自如下方面 ...

  7. java selenium iframe_如何使用java在Selenium WebDriver中处理iframe

    4t43t4 在这种情况下,iframe下有一个iframe.我必须选择外部iframe去内部iframe并写入内部iframe中的主体. 接下来,我必须从内部iframe到外部iframe,然后单击 ...

  8. Selenium Web 自动化 - Selenium常用API

    Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作   1.1 用webdriver打开一个浏览器   1.2 最大化浏览器&关闭浏 ...

  9. java selenium (十四) 处理Iframe 中的元素

    有时候我们定位元素的时候,发现怎么都定位不了. 这时候你需要查一查你要定位的元素是否在iframe里面 阅读目录 什么是iframe iframe 就是HTML 中,用于网页嵌套网页的. 一个网页可以 ...

最新文章

  1. 2022-2028年中国再生天然橡胶行业市场调查分析及未来前景分析报告
  2. 导航条——收缩式导航菜单
  3. 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例
  4. python实践心得体会_“Python自然语言实践”——总结(一),实战
  5. go 成长路上的坑(1)
  6. Oracle表的并行度
  7. 知了课堂 python_知了课堂Python Flask系列(1)-基础篇 flask视频教程下载
  8. HTML日期时间插件
  9. 《下学梯航》(全文)
  10. beetl模板使用场景_Beetl模板引擎入门教程
  11. 戴尔豪斯大学计算机科学学费,加拿大研究生申请案例:渥太华大学录取:电子商业科技申请案例【2013】...
  12. Latex自定义图表序号
  13. 2013年度CSDN十大博客之星
  14. 操作系统总结(大全)
  15. CSDN问答标签技能树(一) —— 基本框架的构建
  16. 赵小楼《天道》《遥远的救世主》深度解析(11)芮小丹和肖亚文俩人身上值得我们学习的点。
  17. html插入外链音乐,GitHub Page插入网易云音乐外链
  18. 《ERP高级计划》书解读-APS案例分析之五时间点的计算(蔡颖)(转)
  19. day 11/6 英语词汇
  20. C# 加减乘除计算器

热门文章

  1. sum_series() 求一列数的指定个数的数和(5个数字的和)
  2. 为计算机编程序英语作文,计算机编程员英文简历范文
  3. 字符串匹配shiftand算法
  4. datax 持续数据同步_Datax 数据同步
  5. 软件项目技术方案_榆林化学公司项目工艺包关键技术创新方案审查顺利完成
  6. python wxpython plt_wxpython和多个面板中的多个plt图
  7. apache 安装后默认主页无法打开_CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法...
  8. dbscan算法中 参数的意义_基于变参数的DBSCAN算法
  9. loadingcache 有重试机制吗_重试机制的实现
  10. 2021-08-29概率论—第四章随机变量的数字特征