Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件

时间:2023-01-12 11:14:45

一、Selenium测试-常用页面处理

1、概述

  UI自动化测试(GUI界面层):UI层是用户使用产品的入口,所有功能通过这一层提供给用户,测试工作大多集中在这一层,常见的测试工具有UFT、Robot Framework、Selenium、Appium等,今天我们的主角就是selenium。

2、Selenium常见页面操作

  相信对于每个做过ui(gui页面测试)的人都知道,界面自动化测试的核心就是定位元素,本篇的重点就是和大家探讨下,如何处理测试过程中常见的页面元素操作,主要分为【text field or textarea输入框】、【Button按钮】、【Radio Button单选框】、【Checkbox复选框】、【Select下拉框】、【左右选择框】、【form表单】、【Upload File上传文件】、【Drag andDrop拖拉】、【Mouse MoveOn鼠标悬停】、【弹窗alert/confirm/prompt】、【windows弹窗】、【table表格】、【富文本框】

3、selnium实战操作

a、【Button按钮】、【Radio Button单选框】、【Checkbox复选框】【form表单】

  对于按钮、单选多选框的操作是一样的,都需要先定位到元素,在进行点击操作即可,只是复选框要定位多个选项后在点击。

  /*Button*/

  WebElement Button = driver.findElementByid();

  Button.click();

  /*RadioButton*/

  WebElement radiobutton = driver.findElement(By.id("sexID2"));

  radiobutton.click();

  /*Checkbox*/ 

  WebElement RadioC = driver.findElement(By.id("u1"));

  WebElement RadioX = driver.findElement(By.id("u2"));

  RadioC.click();

  RadioX.click();

  表单同button

b、【Select下拉框】

  下拉框是一个很常见的页面元素,和其他定位方式不同的是,需要引入Select类,并初始化下拉框元素对象,然后用select的方法进行取值

  Select select = new Select(driver.findElement(By.id("areaID")));//select 初始化下拉框对象,然后进行下面的取值

  select.selectByIndex(index);

  select.selectByValue("tianjin");

  select.selectByVisibleText("北市");

备注:select有三种取值方式,如索引:selectByIndex、值:selectByValue、本文:selectByVisibleText,其中最常用的是selectByVisibleText

c、【左右选择框】

  Select select= new Select(driver.findElement(By.id("languages"))); //先处理选择框

  select.selectByVisibleText(“English”);

  WebElement moveButton=driver.findElement(By.id("addButton")); //再处理向右移动的按钮

  moveButton.click();

d、【Upload File上传文件】

  WebElement fileload = driver.findElement(By.name("file"));

  fileload.sendKeys("E:\\上传文件.txt");

e、【Mouse MoveOn鼠标悬停】

  悬停操作主要针对于比如赶集网、百度首页的更多按钮,因为“更多”里面的菜单无法直接选中,应用还比较广泛,也需要引入新的类型Action,并对driver进行初始化。如下:

  WebElement moreButton = driver.findElement(By.name("tj_briicon"));

  Actions action = new Actions(driver);

  action.moveToElement(moreButton).perform();

f、【Drag andDrop拖拉】

  暂时还没研究特别明白,暂时不做介绍  

g、【弹窗alert/confirm/prompt】

  弹框是一个比较常见的事物,而且种类也特别多,主要是alert警告窗口、confirm确认窗口、prompt提示窗口三种,至于alert和confirm的区别,alert点击确定后就关不了提示窗口,而confirm你点击确定和取消会弹出不同的窗口或者不同的处理,他们和windows窗口的最大区别是F12开发者工具无法打开。如果可以打开就需要视为window弹窗处理。三种提示窗口如下图:

  alert

·      Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件

   confirm

    Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件

  prompt

    Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件

  下面介绍下以上三种提示框代码操作

  

  //处理alert confirm
  driver.findElement(By.id("alert")).click(); //点击会触发alert的元素,比如按钮

  Alert alert = driver.switchTo().alert();

  String text = alert.getText(); //获取alert上的文本

  System.out.println(text);

  //alert.accept();

  alert.dismiss(); //关闭alert

  //处理prompt

  driver.findElement(By.id("alert")).click(); //点击会触发alert的元素,比如按钮

  Alert alert = driver.switchTo().alert();

  String text = alert.getText(); //获取alert上的文本

  prompt.sendKeys("ok!!!!"); //输入值,如果支持输入的话,这是唯一区别

  //alert.accept();

  alert.dismiss(); //关闭alert

h、【windows弹窗】

  在讲解弹窗之前,我们要知道一个概念,那就是句柄,其实大家可以把句柄理解为浏览器窗口的一个属性,我们每次打开浏览器都会被赋予一个唯一句柄属性,这样操作系统就知道该操作那个页面了,就相当于人的身份证一样,或者理解为程序里面的指针,这样每次我们操作浏览器窗口的时候,我们只需要将句柄切换到待操作窗口就可以正确的获取元素和操作元素了,话不多说,看下面的代码

  String currentwindow = driver.getWindowHandle();//获取当前页面句柄

  那么如果打开了多个窗口,就需要用如下函数获取所有句柄

  Set <String> handles = driver.getWindowHandles();

  获取句柄有多中方式,set集合迭代器Iterator、for循环 我将用两种方式分别实现

  Interator <string> it = handles.iterator();

  while(it.hasNext()){

   String handle = it.next(); 

   if (currentwindow.equals(handle)){

    //此处根据自己的条件灵活的判断。
    continue;
   }
   WebDriver window = driver.switchTo().window(handle);//切换   注意,这里要根据你判断的条件来确定你切换的位置。请看for循环

  }

  for (String handle : handles){

    WebDriver window = driver.switchTo().window(handle);

    if (window.getTitle().equals("百度一下,你就知道")) {

       System.out.println("title,url = " + window.getTitle() + ","+ window.getCurrentUrl());

    }
}

i、【table表格】

  表格的处理一般有2中处理方式,一种是xpath定位,另一种是层级定位,下面我将针对这2种形式进行逐一讲解

  xpath: 

public class Table{

  private String locator;

  private WebDriver driver;

/ 表格初始化,入参为driver和table的定位,使用xpath相对路径的方式定位table */

  public Table(WebDriver dr, String locator) {

    this.driver = dr;

    this.locator = locator;

  }

/* 根据行列坐标,取单元格里的内容,标题和操作区从1开始计算,@param row @param col*/

  public String getCellText(int row, int col){

    //拼接单元格的路径

    String xpath = locator + "/tr[" + row +"]/td[" + col + "]";

    WebElement cell = driver.findElement(By.xpath(xpath));

    return cell.getText();

    }

}

// 层级定位表格的方式,坐标从0开始
public class Table {

  private WebDriver driver;

  public Table(WebDriver driver) {

    this.driver = driver;

  }

/*从一个table的单元格中得到文本值.先定位table的值,在根据table对象定位子元素的位置*/

 

  public String getCellText(By by, int row, int col) {

    // 得到table元素对象,by是By.**("")的封装 ,selnium自带

    WebElement table = driver.findElement(by);

    // 得到table表中所有行对象,并得到所要查询的行对象。

    List<WebElement> rows = table.findElements(By.tagName("tr"));

    WebElement theRow = rows.get(row);

    // 调用getCell方法得到对应的列对象,然后得到要查询的文本。

    String text = getCell(theRow, col).getText();

    return text;

  }
  private WebElement getCell(WebElement Row, int col) {

    List<WebElement> cells;

    WebElement target = null;

    // 列里面有"<th>"、"<td>"两种标签,所以分开处理。

    if (Row.findElements(By.tagName("th")).size() > 0) {

    cells = Row.findElements(By.tagName("th"));

    target = cells.get(col);

    }

    if (Row.findElements(By.tagName("td")).size() > 0) {

    cells = Row.findElements(By.tagName("td"));

    target = cells.get(col);

    }

    return target;

  }

}

j、【富文本框】

   文本框可用js也可以用selenium常规定位方式,主要看文本框是否好定位,有些文本框无法特别移动按钮没有id、name等属性值,这时候可以用js定位,有的很容定位,则用元素定位方式既可。

  /*js处理富文本编辑框*/

  driver.switchTo().frame("ueditor_0");

  //定位到富文本输入框所在的frame

  JavascriptExecutor js = (JavascriptExecutor) driver;

     js.executeScript("document.body.innerHTML='ABCDEFG'"); //通过js赋值进去

   /*常规处理富文本编辑框*/

  driver.switch_to.frame('iframe')//切换ifranme

  driver.findElement(By.id("element"));

  driver.findElement(By.id("textarea")).sendKeys("hello world");

  WebElement moveButton = ddriver.findElement(By.id("element"));

  moveButton.click();

l、iframe的处理

  driver.switchTo().frame(Int index); //传入参数为frame的序号,从0开始

  driver.switchTo().frame(String nameOrId); //传入参数为frame的ID或者Name属性

  driver.switchTo().parentFrame(); //切换回父级 –高版本selenium可用

  driver.switchTo().defaultContent(); //切换回默认

备注:查找元素必须在对应的iframe或者frame中查找,否则是找不到的。如果用int index来切换,那么iframe和frame是统一计数。

4、selenium重要的方法

  driver.getTitle();//获取标题

  driver.getCurrentUrl();//获取当前页面url

  driver.getPageSource();//获取页面资源

  driver.switchTo().window(currentwindow);//跳转到currentwindow句柄页面

  driver.manage().window().maximize();//最大化

  driver.manage().addCookie(Cookie cookie);//添加删除cookie

  driver.switchTo().alert();切换到alert窗口

 

总结:以上就是selenium基本元素操作的全部内容,希望对刚开始学习的同学有帮助,学习自动化最重要的是实践,还有就是融汇贯通,在不同的场景下,运用不同的方法组合,举一个“栗子”,是我在测试中遇见的个大坑,有一个项目,我点击创建用户后,新增页面无法用F12开发者工具定位,又不是alert,最终我采用的方法:第一步切换到新增页面句柄,获取并输出当前页面的driver.getCurrentUrl();然后手工在另外一个浏览器中打开,这时候用开发者工具F12定位的时候,发现可以了。希望能给刚学自动化UI测试的同学们一点启发,大牛请自行飘过,后续我将编写一些在操作浏览器的时候遇见的坑,敬请期待,有过有不对的地方,也请各位大牛提出,欢迎评论