经过前面两篇文章的铺垫,我们这篇介绍,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.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Set;
  7. import java.util.concurrent.TimeUnit;
  8.   
  9. import org.openqa.selenium.By;
  10. import org.openqa.selenium.WebDriver;
  11. import org.openqa.selenium.WebElement;
  12. import org.openqa.selenium.chrome.ChromeDriver;
  13.   
  14. public class ElementOpration {
  15. public static void main(String[] args) throws Exception {
  16.   
  17. System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
  18.   
  19. WebDriver driver = new ChromeDriver();
  20.   
  21. driver.manage().window().maximize();
  22.   
  23. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  24.   
  25. driver.get("https://www.jd.com/");
  26.  
  27. Thread.sleep(1000);
  28.   
  29. //点击京东左侧菜单中的 手机
  30. WebElement phone_link = driver.findElement(By.linkText("手机"));
  31. phone_link.click();
  32. Thread.sleep(1000);
  33.   
  34. // 获取当前页面句柄
  35. String handle = driver.getWindowHandle();
  36. // 获取所有页面的句柄,并循环判断不是当前的句柄
  37. for (String handles : driver.getWindowHandles()) {
  38. if (handles.equals(handle))
  39. continue;
  40. driver.switchTo().window(handles);
  41. }
  42.   
  43. WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
  44. xiaomi_link.click();
  45. Thread.sleep(1000);
  46.   
  47. }
  48. }

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

修改后脚本代码如下:

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

上面实现了页面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处理浏览器多窗口切换的更多相关文章

  1. Java+Selenium3方法篇24-单选和多选按钮操作

    Java+Selenium3方法篇24-单选和多选按钮操作 本篇介绍 webdriver处理前端单选按钮的操作.单选按钮一般叫raido button,就像我们在电子版的单选答题过程一样,单选只能点击 ...

  2. 《手把手教你》系列技巧篇(二十三)-java+ selenium自动化测试-webdriver处理浏览器多窗口切换下卷(详细教程)

    1.简介 上一篇讲解和分享了如何获取浏览器窗口的句柄,那么今天这一篇就是讲解获取后我们要做什么,就是利用获取的句柄进行浏览器窗口的切换来分别定位不同页面中的元素进行操作. 2.为什么要切换窗口? Se ...

  3. webdriver实现简单的窗口切换

    webdriver实现简单的窗口切换,也只能是简单的,因为目前处于学习阶段,复杂的情况现在还没碰到过.之前写过关于一个小demo的总结,就有提到过在新开窗口进行操作的情况,用以下一句就可以搞定了,la ...

  4. Python模拟浏览器多窗口切换

    # 模拟浏览器多窗口切换 # 代码中引入selenium版本为:3.4.3 # 通过Chrom浏览器访问发起请求 # Chrom版本:59 ,chromdriver:2.3 # 需要对应版本的Chro ...

  5. js监听浏览器tab窗口切换

    js监听浏览器tab窗口切换 ——IT唐伯虎 摘要:js监听浏览器tab窗口切换. if (document.hidden !== undefined) {  document.addEventLis ...

  6. selenium2-java 浏览器不同窗口切换

    1,获取浏览器的单个窗口:         String parentWindowid =  driver.getWindowHandle();         System.out.println( ...

  7. selenium(java)浏览器多窗口切换处理

    要在多个窗口直接切换,首先获取每个窗口的唯一标示符(句柄),通过窗口属性可以获取所有打开窗口的标示符,以集合的形式返回:以下示例:       Set<String> winHandels ...

  8. web自动化之浏览器的窗口切换

    from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from seleni ...

  9. Python3+Selenium2完整的自动化测试实现之旅(四):Selenium-webdriver操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换

    本篇学习总结webdriver模块操作浏览器.Cookie.鼠标键盘.警示框.设置等待时间.多窗口切换等方法的使用 1    浏览器控制 Selenium-webdriverAPI提供了对页面元素定位 ...

随机推荐

  1. 剑指Offer-7.斐波那契数列(C++/Java)

    题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 分析: 斐波那契数列是0,1,1,2,3,5,8,13...也就是当前 ...

  2. SQL Server 修改数据库

    1. 可视化界面修改数据库 (1)右击数据库,然后选择属性. (2)在工具选项卡中,选择[文件]页,可以更改所有者,文件大小,自增量等参数. 2.  使用ALTER Database修改数据库 (1) ...

  3. vs2017 升级后无法启动 z

    Visual Studio 2017 无法启动,进程中却有devenv.exe运行的解决办法 双击Visual Studio 2017,系统没有响应,在任务管理器中却发现devenv.exe 已经在运 ...

  4. javascript播放图片序列帧

    javascript播放图片序列帧1 先预加载<pre>var load_img = [];for(k=0;k<=16;k++){load_img.push( '/cjsxy/ima ...

  5. JeeSite | 访问控制权限

    在各种后台系统中都会涉及到权限的管控,从功能权限的管控,到数据权限的管控,都是为了让系统的在使用的过程中更加的安全.功能权限管控是对针对不同的角色可以进行不同的功能操作,而数据权限管控是针对不同的角色 ...

  6. 【洛谷5437】【XR-2】约定(拉格朗日插值)

    [洛谷5437][XR-2]约定(拉格朗日插值) 题面 洛谷 题解 首先发现每条边除了边权之外都是等价的,所以可以考虑每一条边的出现次数. 显然钦定一条边之后构成生成树的方案数是\(2*n^{n-3} ...

  7. 解决前后端调用,跨域二次请求Access-Control-Max-Age

    发现前后端分离的项目中,前端发起一个请求到后端,在Chrome浏览器下面debug的时候,Network下面看到同一个url有两条请求,url有两条请求,第一条请求的Method为OPTIONS,第二 ...

  8. kali渗透综合靶机(七)--Super-Mario-Host靶机

    kali渗透综合靶机(七)--Super-Mario-Host靶机 靶机百度云下载  链接:https://pan.baidu.com/s/13l1FUgJjXArfoTOfcmPsbA 提取码:a8 ...

  9. kali渗透综合靶机(六)--FristiLeaks靶机

    kali渗透综合靶机(六)--FristiLeaks靶机 靶机地址下载:https://download.vulnhub.com/fristileaks/FristiLeaks_1.3.ova 一.主 ...

  10. 五分钟看懂UML类图与类的关系详解

    在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(Dependency)和关联(Association).其中关联又分为 ...