选择浏览器
一、打开Firefox浏览器
1 导入包
import org.openqa.selenium.*; import org.openqa.selenium.WebDriver.*; import org.openqa.selenium.firefox.*;
2 打开Firefox浏览器
// 若不是按照默认路径安装Firefox,则需要设置以找到firefox.exe路径 // System.setProperty("webdriver.firefox.bin","E:\\Firefox\\firefox.exe"); WebDriver driver = new FirefoxDriver();
二、打开IE浏览器
WebDriver driver = new InternetExplorerDriver();
三、打开Chrome浏览器
WebDriver driver = new ChromeDriver();
浏览器导航对象Navigation
通过WebDriver的Navigate()方法获得Navigation对象实例;
Navigation navigation = driver.navigate();
一、访问某个网页
1 不使用navigation对象
driver.get("http://photo.163.com");
2 使用navigation对象
navigation.to("http://photo.163.com"); // 或 driver.navigate().to("http://photo.163.com");
二、返回上一个访问的网页
navigation.back(); // 或 driver.navigate().back();
三、从上次访问页面前进到下一个页面
navigation.forward(); // 或 driver.navigate().forward();
四、刷新当前页面
navigation.refresh(); // 或 driver.navigate().refresh();
元素定位
一、回顾
// 初始化一个FirefoxDriver类的对象,名叫driver WebDriver driver = new FirefoxDriver(); // 使用driver对象打开youdao首页 driver.get("http://www.youdao.com"); // 使用driver对象HTML属性id等于"translateContent"的对象,即有道搜索的输入框,名叫element WebElement element = driver.findElement(By.id("translateContent")); // 向element输入框对象中输入“Selenium”关键字 element.sendKeys("Selenium");
先找到需要操作的元素对象,如driver/ element,使用该对象调用相应的API方法,如get()/ sendKeys(),再传入数据,如"Selenium",进行预设的自动化操作。
二、UI自动化语法
UI自动化语法 = 对象 + 操作 + 数据
对象 | 操作 | 数据 |
浏览器driver | 打开get | http://www.youdao.com |
浏览器driver | 寻找元素findElement | By.id("translateContent") |
输入框element | 输入sendKeys | Selenium |
三、Web元素定位语法
在每一个Web页面中有大量Web元素,如按钮、链接、图片、文字等;
在Selenium Web中,页面上每一个Web元素都可对应到WebElement对象,WebElement对象可通过WebDriver的实例获取;
Selenium提供寻找Web元素的方法findElement,在Java中通过定位器By查找Web元素。
1 元素ID——有效、推荐!
<pre name="code" class="html"><input id="translateContent" type="text" placeholder="在此输入要翻译的单词或文字" autocomplete="off" maxlength="256" onfocus="this.select()" onmouseover="this.focus()" name="q">
WebElement element = driver.findElement(By.id("translateContent"));
2 元素Name
<input id="translateContent" type="text" placeholder="在此输入要翻译的单词或文字" autocomplete="off" maxlength="256" onfocus="this.select()" onmouseover="this.focus()" name="q">
WebElement element = driver.findElement(By.name("q"));
3 元素Class Name
<a class='test example'>testExample</a>
WebElement element = driver.findElement(By.className("test")); // 或 WebElement element = driver.findElement(By.className("example"));
注意:By.className 找的是单个class,<a class="test example"/>表示这个标签有两个class分别为test和example,其中的空格是分隔符的意思。
4 超链接文本
<a href="http://www.youdao.com/about/">关于有道</a>
WebElement element = driver.findElement(By.linkText("关于有道"));
5 缺省超链接文本
5.1 获取第一个匹配的链接对象
WebDriver element = driver.findElement(By.partialLinkText("有道"));
5.2 获取所有匹配的链接对象,存储在List容器变量
List<WebElement> elements = driver.findElements(By.partialLinkText("有道"));
注意:findElements()方法返回一个元素集合的List。
6 元素Tag Name
<span class="active">精选阅读</span>
WebElement element = driver.findElement(By.tagName("span"));
注意:如果页面上存在多个满足条件的元素,findElement()方法只会返回页面树状结构中自上而下的第一个匹配元素。
7 Xpath
XPath定位方式是自动化测试定位技术中必杀技;
<input id="translateContent" type="text" placeholder="在此输入要翻译的单词或文字" autocomplete="off" maxlength="256" onfocus="this.select()" onmouseover="this.focus()" name="q"/>
WebElement element = driver.findElement(By.xpath("//input[@id='translateContent']"));
操作页面元素WebElement
一、单击
element.click();
注意:对于勾选或取消复选框和单选框,没有check/ uncheck方法;对于选择下拉列表框,没有select方法,只能使用click方法模拟;
二、输入
给input元素输入文本;
element.sendKeys("sissiy_express");
三、清除
清空input元素的值;
element.clear();
四、提交
对制定元素所在的form元素进行提交;
element.submit();
如输入帐号和密码,再对密码文本框使用submit()方法,而不是单击“登录”按钮;
获取页面及页面元素的内容
一、获取当前页面的标题
System.out.println(driver.getTitle());
二、获取当前页面的URL
System.out.println(driver.getCurrentUrl());
三、获取某个元素的文本值
System.out.println(element.getText());
四、获取复选框或单选框的勾选情况
System.out.println(element.isSelected());
五、获取某个元素的tag名称
System.out.println(element.getTagName());
六、获取input等元素的可编辑状态
System.out.println(element.isEnabled());
七、获取某个元素在页面的显示情况
System.out.println(element.isDisplayed());
八、获取某个属性的值
System.out.println(element.getAttribute("class"));
弹出对话框的处理
一、对话框
JavaSript有3中弹出对话框,即Alert、Confirmation、Prompt;
1 警告对话框Alert
只有一个“确认”按钮;
2 确认对话框Confirmation
需要选择;
3 输入对话框Prompt
需要输入内容;
二、处理
Selenium 2中,弹出对话框统一视为Alert对象,只需调用Alert对象的方法即可;
1 accept()
对Alert、Confirmation、Prompt对话框,单击弹出对话框的确认按钮;
driver.switchTo().alert().accept();
2 dimiss()
对Alert、Confirmation、Prompt对话框,单击弹出对话框的取消按钮;
注意:对于Alert,accept()和dismiss()没有区别,不必使用dismiss();
driver.switchTo().alert().dismiss();
3 sendKeys(keysToSend)
对Prompt对话框,输入文本;
driver.switchTo().alert().sendKeys("卟芝岛");
4 getText()
获取弹出对话框的文本内容;
System.out.println(driver.switchTo().alert().getText());
浏览器多窗口处理
在进行Web测试时,会弹出子窗口,并在多窗口之间进行切换操作;
一、获取窗口的唯一标识符(句柄)
driver.getWindowHandles()获取所有打开窗口的标识符,并将其以集合的形式返回;
String[] handles = new String[driver.getWindowHandles().size()]; driver.getWindowHandles().toArray(handles); for (int i = 0; i < handles.length; i++) System.out.println(handles[i]);
二、切换窗口
driver.switchTo().window(windowName)通过其标识符切换到该窗口,之后可对该窗口进行操作;
WebDriver newdriver = driver.switchTo().window(handles[1]);
设置管理
一、window()
通过window()方法对当前窗口进行简单的控制,如查看窗体的坐标和大小,将其最大化;
// 获取窗体的坐标 System.out.println(driver.manage().window().getPosition().x); System.out.println(driver.manege().window().getPosition().y); // 获取窗体的长宽 System.out.println(driver.manage().window().getPosition().width); System.out.println(driver.manage().window().getPosition().height); // 将当前窗口最大化 driver.manege().window().maximize();
二、timeouts()
timeouts()方法获取Timeouts对象,该对象包含三种方法:
1 implicitlyWait()
设置脚本在查找元素时的最大等待时间,如findElement()和findElements()方法;
2 setScriptTimeout()
页面操作超时时间,如页面进行跳转或刷新的最大等待时间;
3 pageLoadTimeout()
设置脚本异步执行的超时时间;
// 将脚本在查找元素时的最大等待时间设置为30s driver.manage().timeouts().implicitlyWait(30, java.util.concurrent.TimeUnit.SECONDS); // 将页面跳转或刷新的超时时间设置为30s driver.manage().timeouts().setScriptTimeout(30, java.util.concurrent.TimeUnit.SECONDS); // 将脚本异步执行的超时时间设置为30s driver.manage().timeouts().pageLoadTimeout(30, java.util.concurrent.TimeUnit.SECONDS);
结束测试
当测试执行完,结束测试有两种方法,即使用close()方法关闭WebDriver当前所在的窗口,使用quit()方法关闭所有相关窗口。
一般,测试没有结束但需要关闭某个窗口时,使用close()方法关闭指定窗口;测试结束时,使用quit()方法关闭所有相关窗口。
// 切换到指定窗口并关闭 driver.switchTo().window(handles[1]); Thread.sleep(3000); driver.close(); // 关闭所有窗口 driver.quit();
基本操作
实例:
1 需求
Web自动化登录网易相册,并创建一个相册
2 步骤
a 开启Firefox浏览器
b 访问http://photo.163.com
c 分别使用错误/正确的网易邮箱帐号登录
d 在该账号下创建一个相册
e 关闭浏览器
3 需求抽象出来的操作
a 打开网页get
WebDriver driver = new FirefoxDriver(); driver.get("http://photo.163.com");
b 输入内容sendKeys
WebElement element = driver.findElement(By.name("username")); element.sendKeys("[email protected]"); // sendKeys()方法可以传递多个String参数,可以使用拆分字符串的方式输入 // 尤其在有些系统有防机器人的策略,通过拆分字符串输入方式,避免让系统认为是机器人行为 // element.sendKeys("auto", "test1","@163.com");
c 点击元素click
WebElement element = driver.findElement(By.className("js-cur")); element.click();
d 清空内容clear
WebElement element = driver.findElement(By.name("password")); element.clear();
e 获取网址getCurrentUrl
WebDriver driver = new FirefoxDriver(); driver.get("http://photo.163.com"); System.out.println(driver.getCurrentUrl());
f 获取页面标题getTitle
System.out.println(driver.getTitle());
g 获取元素文本getText
WebElement element = driver.findElement(By.className("album")); System.out.println(element.getText());
h 关闭浏览器quit
driver.quit();
4 知识点
4.1 打开网页get
使用方式:
WebDriver支持HTTP/HTTPS,对于网页格式必须严格遵循以http或https开头的原则,否则认为是非法网址
操作特性:
页面完全打开后,get方法才结束
注意:
只保证最初页面完全打开,不判断重定向后页面的打开情况
4.2 输入内容sendKeys
使用对象:
注意:
sendKeys()方法在原来输入内容后追加输入
4.3 点击元素click
使用对象:
click()方法可以操作除不可见元素或宽和高均为0的元素的其他所有元素;
操作特性:
所有元素都可以被点击
注意:
元素不能被遮挡(模拟鼠标,若被广告遮挡,鼠标就在广告页面)
元素不能被隐藏(CSS设置为隐藏的元素,调用click()方法可能抛出元素不可点的异常)
4.4 清空内容clear
使用对象:
注意:
整体清除,不是按一下退格的删除
4.5 获取页面标题getTitle
使用对象:
对象是整个页面的title标签,而不是某个元素的title属性。
注意:
若不存在title,则返回NULL。
4.6 获取文案getText
使用对象:
元素闭合标签之间的文本内容,而不是title属性。
注意:
包含子元素中的text内容
元素不能被CSS隐藏
4.7 关闭浏览器quit
注意:
测试结束后不关闭浏览器则会常驻内存,导致内存溢出。