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 -- 鼠标移入显示下拉框 不显示的问题 / 以及宽度问题
这个问题,真的是打击到我了,我一度不相信自己无法解决这个问题.但是我就是真的没有解决. 那么问题解决方案是: 第一 祖先级别有一个相对定位,父级再有一个定位,那么绝对定位显示出来的元素就会不显示. 第 ...
随机推荐
- HDU 5222 ——Exploration——————【并查集+拓扑排序判有向环】
Exploration Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 用js语句控制css样式
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- [转] CentOS下添加用户并且让用户获得root权限
http://www.centoscn.com/CentOS/config/2014/0810/3471.html 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser ...
- 【OSI】网络协议模型
一.网络相关概念 IP地址: 主机 用于 路由寻址 用的数字标识 域名: 便于IP地址记忆 DNS: 通过注册的 域名 指向 ip 的服务 DDNS: 将用户的动态IP地址映射到一个固定的域名解析服 ...
- UML建模概述
UML的组成主要有事物.图.关系. UML中的事物: (1)构件事物:UML模型的静态部分,描述概念或物理元素,包括以下 a. 类:类是对一组具有相同属性.相同操作.相同关系和相同语义的对象的抽象.包 ...
- 使用waitfor 语句
aitfor语句用于延迟后面语句的执行,可以指定延迟时间长度是具体的时间.参考下面的语句: waitfor delay ’00:01:15’ print N’到时间了’ --也可以不加N 字符串 ...
- scss-数据类型
scss当前支持七种主要数据类型 (1).数字,1, 2, 13, 10px. (2).字符串,有引号字符串与无引号字符串,"foo", 'bar', baz. (3).颜色,bl ...
- linux注册服务教程
该说明是项目完成很久之后,整理资料时的偶然发现,当时所操作的linux为中标麒麟,需要对项目进行开机自启,对llinux还不熟悉,找不到linux中的服务自启设置.辗转多次才找到了解决方案.记录以供参 ...
- js 时间特效
http://example.com:1234/test.htm#part2:Hash的作用. http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...