Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件
一、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
·
confirm
prompt
下面介绍下以上三种提示框代码操作
//处理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测试的同学们一点启发,大牛请自行飘过,后续我将编写一些在操作浏览器的时候遇见的坑,敬请期待,有过有不对的地方,也请各位大牛提出,欢迎评论
Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件的更多相关文章
- Bootstrap学习笔记(5)--实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单
实现Bootstrap导航条可点击和鼠标悬停显示下拉菜单 微笑的鱼 2014-01-03 Bootstrap 5,281 次围观 11条评论 使用Bootstrap导航条组件时,如果你的导航条带有下拉 ...
- 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换
查看本章节 查看作业目录 需求说明: 使用 jQuery 实现页面背景色的更换,通过下拉框选择对应的颜色,页面背景会随着选中的颜色进行更换 实现思路: 在页面中添加 <select> 标签 ...
- Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载
元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...
- selenium 显示等待wait.until 常用封装 及下拉框的选择操作等
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait a ...
- Selenium常用操作汇总二——如何操作select下拉框
下面我们来看一下selenium webdriver是如何来处理select下拉框的,以http://passport.51.com/reg2.5p这个页面为例.这个页面中有4个下拉框,下面演示4种选 ...
- selenium 难定位元素,时间插件,下拉框定位,string
1.元素定位 ID定位元素: findElement(By.id(“”)); 通过元素的名称定位元素: findElement(By.name(“”)); 通过元素的html中的位置定位元素: fin ...
- selenium 难定位元素,时间插件,下拉框定位,string包含,定位列表中的一个,技巧
关于frame: 如果网页存在iframe的话,传统的定位有时候找不到元素,需要切换frame: # 切换到leftFrame定位“测井设计” driver.switch_to_frame(" ...
- bootstrap 导航栏鼠标悬停显示下拉菜单
在jsp中加入一下代码: .navbar .nav > li:hover .dropdown-menu { display: block;} 全部代码如下所示: <%@ page lang ...
- selenium如何随机选取省份和城市的下拉框的值
1.原始需求,选择省份后,相应的城市会自动加载 2.思路 a.获取下拉框的所有元素个数 b.随机点击0-元素个数之间的某个值 3.代码实现 Random random = new Random(); ...
- IE7 -- 鼠标移入显示下拉框 不显示的问题 / 以及宽度问题
这个问题,真的是打击到我了,我一度不相信自己无法解决这个问题.但是我就是真的没有解决. 那么问题解决方案是: 第一 祖先级别有一个相对定位,父级再有一个定位,那么绝对定位显示出来的元素就会不显示. 第 ...
随机推荐
- 4、Angular2 pipe
1. stateless pipe 2.stateful pipe
- 项目搭建系列之二:SpringMVC框架下配置MyBatis
1.什么是MyBatis? MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis ...
- jsp的动作标签
常用的标签: 1. forward 请求转发 [基本不使用] <==> request.getRequestDispatcher(url).forward(request,respon ...
- Java 匿名内部类 & 内部类
一.JAVA中内部类和匿名内部类的区别 内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用. ...
- 转-vs2017安装并且安装包不占用C盘空间
平常的安装方式,不论是在线安装还是下载的离线安装包,都会在安装过程中将vs2017的安装包保存在C:\ProgramData\Microsoft\VisualStudio\Packages文件夹下并占 ...
- composer 实用总结
1.在windows 下配置php环境变量 我电脑------右键属性-----高级系统设置-----环境变量---点击path----添加php.exe路径到环境变量 C:\phpStudy\php ...
- Vue2.0+Node.js+MongoDB全栈打造商城系统
vue.js +axios mock数据 在main.js中 import axios from 'axios' Vue.prototype.$ajax = axios webpack.dev.con ...
- 有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除
(一)placeholder 属性起到提示客户输入信息作用 (二)ie9以下出问题了 placeholder不支持 (三)解决办法 先贴html 加上jquery代码就可以了 关于表单获取焦点,chr ...
- git本地分支重命名
1. 本地分支重命名 git branch -m oldbranchname newbranchname 2. 远程分支重命名 (假设本地分支和远程对应分支名称相同) a. 重命名远程分支对应的本地分 ...
- iDempiere 使用指南 windows下eclipse开发环境配置及打包下载
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...