经过前面两篇文章的铺 垫,我们这篇介绍,webdriver如何处理,一个浏览器上多个窗口之间切换的问题。我们先脑补这样一个测试场景,你在页面A点击一个连接,会在新的 tab窗口打开页面B,这个时候,你在页面B点击一个连接,会在新的tab窗口打开页面C。这种情况,在测试中经常遇到,自动化中,webdriver是 如何处理的呢。

我们先来看一个实例,在京东首页,点击手机,会在新的页面显示手机通讯的页面,在手机页面点击小米,会在新的窗口打开显示小米手机的页面。这个过程,刚好 是页面A到页面B再到页面C。我们先抛开其他的,就是先实现driver在页面A切换到页面B,然后切换到页面C这个过程如何实现,在webdriver 中提供了一个switch.to.window(handle)的方法。参数handle就是前面文章中提到的获取窗口句柄的值。

相关代码如下:

  1. package lessons;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Set;
  6. import java.util.concurrent.TimeUnit;
  7. import org.openqa.selenium.By;
  8. import org.openqa.selenium.WebDriver;
  9. import org.openqa.selenium.WebElement;
  10. import org.openqa.selenium.chrome.ChromeDriver;
  11. public class ElementOpration {
  12. public static void main(String[] args) throws Exception {
  13. System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
  14. WebDriver driver = new ChromeDriver();
  15. driver.manage().window().maximize();
  16. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  17. driver.get("https://www.jd.com/");
  18. Thread.sleep(1000);
  19. //点击京东左侧菜单中的 手机
  20. WebElement phone_link = driver.findElement(By.linkText("手机"));
  21. phone_link.click();
  22. Thread.sleep(1000);
  23. // 获取当前页面句柄
  24. String handle = driver.getWindowHandle();
  25. // 获取所有页面的句柄,并循环判断不是当前的句柄
  26. for (String handles : driver.getWindowHandles()) {
  27. if (handles.equals(handle))
  28. continue;
  29. driver.switchTo().window(handles);
  30. }
  31. WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
  32. xiaomi_link.click();
  33. Thread.sleep(1000);
  34. }
  35. }

上面在获取handles过程写了一个for循环,for循环的句柄和当前driver的句柄相等,那么就continue,也就是结束单循环,什么也不 做。如果不是,那么就调用切换窗口的方法,切换到第二个窗口。到了这里,可能有人就会提出,如果我需要第二个切换到第三个呢,假如说,在判断第三个句柄不 等于第二个,那么driver会不会默认切换到第三个窗口还是切换到第一个呢。如果真要这么做,需要用到ArrayList,然后用到迭代,可能稍微变得 复杂。为了避免这种复杂情况出现,我推荐这样做,只需要把上面代码中的continue语句改成driver.close(),前面文章介绍 过,close是关闭当前页面。如果是页面A点击链接打开页面B,那么这个过程关闭的就是页面A,同时把driver切换到页面B。如果有第三个,从第二 个页面到第三个页面也是用这样切换方法。这里永远就两个页面之间处理的关系。一般来说,自动化也是尽量在一个页面做完相关测试,才会切换到其他页面。

修改后脚本代码如下:

  1. package lessons;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Set;
  6. import java.util.concurrent.TimeUnit;
  7. import org.openqa.selenium.By;
  8. import org.openqa.selenium.WebDriver;
  9. import org.openqa.selenium.WebElement;
  10. import org.openqa.selenium.chrome.ChromeDriver;
  11. public class ElementOpration {
  12. public static void main(String[] args) throws Exception {
  13. System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
  14. WebDriver driver = new ChromeDriver();
  15. driver.manage().window().maximize();
  16. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  17. driver.get("https://www.jd.com/");
  18. Thread.sleep(1000);
  19. //点击京东左侧菜单中的 手机
  20. WebElement phone_link = driver.findElement(By.linkText("手机"));
  21. phone_link.click();
  22. Thread.sleep(1000);
  23. // 获取当前页面句柄
  24. String handle = driver.getWindowHandle();
  25. // 获取所有页面的句柄,并循环判断不是当前的句柄
  26. for (String temhandle : driver.getWindowHandles()) {
  27. if (!temhandle.equals(handle))
  28. driver.close();
  29. driver.switchTo().window(temhandle);
  30. }
  31. WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
  32. xiaomi_link.click();
  33. Thread.sleep(1000);
  34. }
  35. }

上面实现了页面A,切换到页面B,同时关闭页面A,页面B点击触发页面C,这个过程还需要用for循环判断一次。所以关于这块,我建议你单独写成一个方 法,例如静态方法,直接调用这个,就代码看起来很舒服。关于这个,后面我们会介绍,框架设计部分,肯定要写不同的方法进行调用。

Java+Selenium3自动化测试框架设计系列--href="javascript:void(0)"如何获得元素定位的更多相关文章

  1. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  2. html 空链接 href="#"与href="javascript:void(0)"的区别

    #包含了一个位置信息 默认的锚是#top 也就是网页的上端 而javascript:void(0) 仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#但跳动到了页首 而javascrip ...

  3. a href=#与 a href=javascript:void(0) 的区别

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...

  4. <a href=”#”>与 <a href=”javascript:void(0)” 的区别

    <a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...

  5. <a href="javascript:void(0)" onclick="ff()" ></a> 用法解析

    javascript:void(0) 仅仅表示一个死链接 如果是个# javascript:void(#),就会出现跳到顶部的情况,搜集了一下解决方法 1:<a href="####& ...

  6. 转载 a href=#与 a href=javascript:void(0) 的区别

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...

  7. 我们为什么要使用 href="javascript:void(0)"

    做过web前端UI的小伙伴们都知道,有时候我们在网页中会使用一些超级链接,而这些链接不用指向任何地址,只是为了配合javascript的onclick事件而存在的,当我们点击这些链接时(其实也可以看做 ...

  8. <a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');"><em class="rmwd"></em>征稿平台</a>

    <a href="javascript:void(0);" id='test' onclick="javascript:alert('即将上线,敬请期待!');&q ...

  9. a标签的href="javascript:void(0)"和href="#"的区别

    修正一个说法上的bug吧.对于IE6来说,点击后gif暂停bug仅仅发生在“javascript:伪协议未加分号”的情形下. 我再来提供一个视角吧. 给<a>标签增加href属性,就意味着 ...

随机推荐

  1. Codeforces 396A 数论,组合数学

    题意:给一个a数组,求b 数组的方案数,但是要求两者乘积相同. 分析: 不可能将它们乘起来,对于每个数质因数分解,得到每个质因子个数,遍历这些质因子,将某个质因子放到 对应的盒子里面,可以不放,方案数 ...

  2. 【[CTSC2012]熟悉的文章】

    题目 好题啊 \(SAM\)+单调队列优化\(dp\) 首先这个\(L\)满足单调性真是非常显然我们可以直接二分 二分之后套一个\(dp\)就好了 设\(dp[i]\)表示到达\(i\)位置熟悉的文章 ...

  3. JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)

    我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...

  4. pocsuite 实现一个verify检测功能

    今天在测试中发现一个命令执行漏洞,尝试用创宇的pocsuite框架实现.说实话,这玩意儿确实没有自己写POC顺手,非得就着他的标准来,就很难受,以至于耽误了很多时间在规范上.. 影响参数后直接用||连 ...

  5. VK Cup 2012 Round 1 D. Distance in Tree (树形dp)

    题目:http://codeforces.com/problemset/problem/161/D 题意:给你一棵树,问你两点之间的距离正好等于k的有多少个 思路:这个题目的内存限制首先大一倍,他有5 ...

  6. Mac上传文件到Linux服务器

    1. 打开 终端,选择 2.选择安全文件传输,输入连接主机IP 3.输入主机名 4.输入yes,然后输入主机密码,按回车结束 确认连接 输入远程主机密码 5.连接成功,上传文件 put 本地文件路径 ...

  7. scr 和 href 区别

    HTML中的href和src有什么区别? 加载js的时候,用到的是<script style='text/javascript' src='js/demo.js'></script& ...

  8. JavaWeb遗漏的知识点

    1. String javax.servlet.ServletContext.getRealPath(String path)方法 官方文档解释:Gets the real path correspo ...

  9. Python 学习笔记(三)数字

    Python 数字 int 整型  是正或负整数  2 long 长整型  整数最后是一个大写或小写的L   2L float  浮点型 由整数部分和小数部分组成   2.0 complex 复数 小 ...

  10. Java实现桶排序

    public class BucketSort { public static void main(String[] args) { int[] list = {1000, 192, 221, 12, ...