zoukankan      html  css  js  c++  java
  • 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就是前面文章中提到的获取窗口句柄的值。

    相关代码如下:

    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

  • 相关阅读:
    MySQL之触发器
    MySQL之视图
    MySQL之多表查询(笛卡尔积查询、内连接、外连接(左外连接,右外连接)、union、union all )
    MySQL之子查询
    MySQL之关键字
    mysql之内连接,外连接(左连接,右连接),union,union all的区别
    mysql之魔鬼训练营
    MySQL之innodb和myisam的区别
    springmvc+spring+mybatis 项目配置
    Css3 伪元素
  • 原文地址:https://www.cnblogs.com/peachh/p/9739957.html
Copyright © 2011-2022 走看看