一、打开chrome浏览器
1. 安装chrome浏览器
2. 下载控制chrome的驱动器
chrome的版本和chromedriver的版本对应关系和下载地址
https://blog.csdn.net/huilan_same/article/details/51896672
存放路径:
/工程名/src/main/resources/selenium/driver/chromedriver.exe
3. 下载selenium的jar包
pom.xml添加dependency
org.seleniumhq.selenium
selenium-java
2.50.0
org.testng
testng
6.8
4. 新建java类,启动浏览器
自写的类——>selenium——>chromedriver.exe——>chrome浏览器
//此处src前面没有"/",说明是相对工程根目录的路径
System.setProperty("webdriver.chrome.driver",
"src/main/resources/selenium/driver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
如果要窗口最大化,先设置参数,启动的时候传入
//设置环境变量,指定chromedriver的路径
System.setProperty("webdriver.chrome.driver",
"src/main/resources/selenium/driver_v236_63_65/chromedriver.exe");
//设置浏览器的参数
ChromeOptions options = new ChromeOptions();
//最大化浏览器
options.addArguments("--test-type", "--start-maximized");
//指定浏览器位置
//options.setBinary("C:/XXXXXXX/chrome.exe");
//打开浏览器
WebDriver driver = new ChromeDriver(options);
常见报错原因:
- 浏览器和chromedriver版本不一致
- 防火墙导致无法访问chrome浏览器,关闭防火墙
5. 关闭浏览器
//先线程休眠3秒,便于观察,然后才关闭,不然启动就关闭像闪退
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//关闭浏览器,driver.close()是关闭当前窗口
driver.quit();
sleep()方法:
public static void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二、地址栏和导航(前进、后退、刷新)
1. get()方法打开
driver.get("http://www.baidu.com");
2. navigate().to()打开
driver.navigate().to("http://www.dangdang.com");
3. navigate导航
// 1\. 先打开一个界面
driver.navigate().to("http://www.baidu.com");
//2\. to()方法再打开另一个界面
driver.navigate().to("http://www.dangdang.com");
sleep(2000);
//3\. back()回退
driver.navigate().back();
sleep(2000);
//4\. forward()前进
driver.navigate().forward();
sleep(2000);
//5\. refresh()刷新
driver.navigate().refresh();
三、4种常见方式定位元素
元素包含信息:
- 标签
- 属性
- 内容
- 位置
1. 按id属性定位元素
WebElement alertButton = driver.findElement(By.id("alertButtonId"));
2. 按name属性定位元素
WebElement alertButton = driver.findElement(By.name("alertButtonName"));
3. 按class定位元素
WebElement buttons = driver.findElements(By.className("alertButtonClass"));
4. 使用xpath定位
1)自动化处理的对象:标签(也称为元素)
java | html |
---|---|
WebElement元素类 | 标签(如html、body、head、table、input、tr、alert弹出框等等) |
2) 标签
- 标签名
- 标签的属性
- 为了定位标签的属性:id、name、class、type
- 为了产生交互效果的属性:触发事件,可以指定触发后要执行的方法
- 要标识的数据:标签都是为了描述数据的
2)xpath:选择html标签
符号 | 用途 | 示例 |
---|---|---|
/ | 绝对路径 | /html/body/table/tbody/tr/td/input |
// | 相对路径 | //body/table//input |
标签名 | html的所有标签 | //input |
[] | 限定t条件 | //input[@id='xxxid' and @type='button'] |
数字 | 指定匹配到的第几个 | //input[3] |
@属性名=属性值 | 通过属性限定条件 | |
函数() | 通过函数限定条件 | |
and/or | 连接多个条件 |
WebElement alertButton = driver.findElement(
By.xpath("//input[@id='alertButtonId' and @type='button']"));
四、常见元素的基本操作
0. 界面模板
导航栏
xxxxxx替换元素代码xxxxxxx
1. text文本框
界面:
自动化代码
sendkeys()传要填的内容
WebElement text=
driver.findElement(By.xpath("//input[@type='text' and @id='edit']"));
text.clear();
text.sendKeys("傻不傻?傻!");
2. file文件上传
界面:
自动化代码
找到元素,sendkeys()传文件路径
WebElement input=
driver.findElement(By.xpath("//input[@type='file' and @name='attach[]']"));
input.clear();
input.sendKeys("C:/HtmlWeb/selenium/html_00_summary.html");
3. radio单选框
界面:
自动化代码
input元素,类型是raidio,name相同的多个radio类型的input组成选项,靠value进行区分
选择具体某个选项,并选择:
WebElement radio=
driver.findElement(
By.xpath("//input[@type='radio' and @name='company' and @value='Mi']"));
radio.click();
所有选项都点一遍:
List radios=
driver.findElements(By.xpath("//input[@type='radio' and @name='company']"));
for(int i=0;i
4. checkbox多选框
界面:
自动化代码
input元素,类型是checkbox,name相同的多个checkbox类型的input组成选项,靠value进行区分
选择具体某一个选项,并选择:
WebElement checkbox=
driver.findElement(
By.xpath("//input[@type='checkbox' and @name='course' and @value='web']"));
checkbox.click();
所有选项都勾选:
List checkboxs=
driver.findElements(
By.xpath("//input[@type='checkbox' and @name='course']"));
for(int i=0;i
5. 时间控件
界面:
自动化代码
先写JavaScript代码,然后通过driver执行js
js第一句是将只读属性去掉(若时间没设只读,则不需要)
js第二句是给时间元素设置value属性,值为“2018-04-10”
String js="document.getElementsByName('startTime')[0].removeAttribute('readOnly');document.getElementsByName('startTime')[0].setAttribute('value','2018-04-10');";
JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.executeScript(js);
6. button按钮
界面:
自动化代码
找到元素,click()点击
WebElement button=
driver.findElement(By.xpath("//input[@type='button' and @id='alertButtonId']"));
button.click();
Alert alert=driver.switchTo().alert();
alert.accept();
7. 文本域
界面:
多行多列的输入框
自动化代码
WebElement textarea=driver.findElement(By.xpath("//textarea[@rows='3']"));
textarea.clear();
textarea.sendKeys(“内容”);
8. img图片
界面:
可点击的图片,都是外面有一层超链接,只是用图片替代了文本
自动化测试的时候,要定位的是超链接
自动化代码
- 定位标签
- 点击
WebElement img=driver.findElement(By.xpath("//a[@id='imgA']"));
img.click();
7. select选择框
界面:
select标签:定义一个下拉框
option选项:定义一个选项,一个下拉框可以有很多个选项,即多个option
option的3个属性:index(选项序号,默认自动加上的)、value选项值、visibleText展现文字
自动化代码
- 先找select标签
- 再找option标签,并选择
- 把select标签封装成Select对象(封装了找select下面所有option的操作)
- 通过value、展现文本、序号
WebElement selectEle=driver.findElement(By.xpath("//select[@id='Selector']"));
Select select=new Select(selectEle);
select.selectByIndex(0);
sleep(1000);
select.selectByValue("banana");
sleep(1000);
select.selectByVisibleText("桔子");
sleep(1000);
8. a超链接
界面:
Copyright 2017 guoyasoft
自动化代码
定位超链接的3中方法:
- 使用xpath
WebElement link=
driver.findElement(By.xpath("//a[@href='http://www.guoyasoft.com']"));
- 使用linkText:按链接的文本精确匹配
WebElement link=driver.findElement(By.linkText("Copyright 2017 guoyasoft"));
- 使用partialLinkText:按链接的文本模糊匹配
WebElement baike=driver.findElement(By.partialLinkText("guoyasoft"));
三种点击方式:1、 当前界面打开;2、新的标签页打开;新的窗口打开
直接点击:当前界面打开
WebElement link=
driver.findElement(By.xpath("//a[@href='http://www.guoyasoft.com']"));
link.click();
ctrl+shift+点击:当前浏览器的新标签页打开
Actions actions=new Actions(driver);
actions.keyDown(Keys.SHIFT).keyDown(Keys.CONTROL).click(link).perform();
shift+点击:新窗口打开(新开一个浏览器)
Actions actions=new Actions(driver);
actions.keyDown(Keys.SHIFT).click(link).perform();
五、alert框切换
界面:
prompt对话框
javascript:
function clickbutton() {
var name = prompt("测试prompt对话框", "");
if (name != null && name != "") {
//document.write(name);
alert(name);
}
}
自动化代码
WebElement clickOnPrompt = driver.findElement(By
.xpath("//td/input[@name='promptbutton']"));
clickOnPrompt.click();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Alert prompt = driver.switchTo().alert();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
prompt.sendKeys("I love Selenium");
prompt.accept();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Alert afterAccept = driver.switchTo().alert();
afterAccept.accept();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
六、窗口切换
界面:
超链接
自动化代码
核心代码:
- driver.getWindowHandle()获取当前窗口句柄
- driver.getWindowHandles()获取浏览器所有窗口句柄
- driver.switchTo().windows(目标句柄)
- 根据窗口的title判断选择的窗口是否正确(先切换控制,再查titile)
public static void switchToWindow(String windowTitle, WebDriver dr) {
// 将页面上所有的windowshandle放在入set集合当中
String currentHandle = dr.getWindowHandle();
Set handles = dr.getWindowHandles();
for (String s : handles) {
dr.switchTo().window(s);
// 判断title是否和handles当前的窗口相同
if (dr.getTitle().contains(windowTitle)) {
break;// 如果找到当前窗口就停止查找
}
}
}
实践测试:
- 打开测试界面
- 打开京东,切回原窗口
- 打开百度,切回原窗口
- 打开当当,切回原窗口
private void testWindow(WebDriver driver, TestSelenium3 test) {
/*
* 第1步:打开测试界面
*/
driver.get("http://127.0.0.1:8081/HtmlWeb/selenium/html_00_summary.html");
Actions actions = new Actions(driver);
/*
* 第2步:点击京东,再切换回原界面
*/
WebElement jd = driver.findElement(By.xpath("//a[@id='link_jd']"));
//按顺序点,按顺序放
actions.keyDown(Keys.SHIFT).keyDown(Keys.CONTROL).click(jd)
.keyUp(Keys.SHIFT).keyUp(Keys.CONTROL).perform();
test.mySleep(1000);
//窗口切换到京东,进行操作,此处不做任何操作
switchToWindow("京东", driver);
test.mySleep(1000);
//切换回原窗口
switchToWindow("selenium", driver);
test.mySleep(1000);
/*
* 第3步:点击百度,再切换回原界面
*/
WebElement baidu = driver
.findElement(By.xpath("//a[@id='link_baidu']"));
actions.keyDown(Keys.SHIFT).keyDown(Keys.CONTROL).click(baidu)
.keyUp(Keys.SHIFT).keyUp(Keys.CONTROL).perform();
actions.click();
test.mySleep(1000);
switchToWindow("百度一下,你就知道", driver);
test.mySleep(1000);
switchToWindow("selenium", driver);
test.mySleep(1000);
/*
* 第4步:点击当当,再切换回原界面
*/
WebElement dangdang = driver.findElement(By
.xpath("//a[@id='link_dangdang']"));
actions.keyDown(Keys.SHIFT).keyDown(Keys.CONTROL).click(dangdang)
.keyUp(Keys.SHIFT).keyUp(Keys.CONTROL).perform();
actions.click();
test.mySleep(1000);
switchToWindow("当当", driver);
test.mySleep(1000);
switchToWindow("selenium", driver);
test.mySleep(1000);
}
七、切换界面框架frame
1. 界面代码
1.1 main.html
iframe测试界面
1.2 top.html
[图片上传失败...(image-e61e46-1534842841384)]
1.3 left.html
1.4 right.html
管理页面
该界面用于展示菜单内容
1.5 button.html
[图片上传失败...(image-720a89-1534842841383)]
2. frame测试代码
第1步:打开测试界面
driver.get("http://127.0.0.1:8081/HtmlWeb/selenium/iframe2/main.html");
第2步:找到左边导航frame框
WebElement leftFrame=driver.findElement(By.xpath("//frame[@src='left.html']"));
第3步:切换控制权到frame窗口
driver.switchTo().frame(leftFrame);
第4步:测试frame框里的内容
WebElement baidu=driver.findElement(By.xpath("//a[@href='http://www.baidu.com']"));
baidu.click();
test.mySleep(2000);
第5步:将控制窗口切换回原主窗口
driver.switchTo().defaultContent();
第6步:定位右窗口,即点击连接后打开的内容
WebElement rightFrame=driver.findElement(By.xpath("//frame[@src='right.html']"));
第7步:切换到右边的frame窗口
driver.switchTo().frame(rightFrame);
第8步:测试右窗口
test.mySleep(3000);
WebElement input=driver.findElement(By.xpath("//input[@id='kw']"));
input.clear();
input.sendKeys("果芽软件");
WebElement submit=driver.findElement(By.id("su"));
submit.click();
test.mySleep(2000);
//定位超链接元素的专用方法(精确和模糊两种,类似id和name选择器)
WebElement baike=driver.findElement(By.linkText("上海果芽软件科技有限公司_百度百科"));
//WebElement baike=driver.findElement(By.partialLinkText("果芽软件"));
baike.click();
test.mySleep(2000);
八、设置界面加载和元素定位等待时间
1. 线程休眠
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2. 隐式等待
//设置界面加载等待时间,全局设置,作用于driver,对所有后续界面加载都有效
driver.manage().timeouts().pageLoadTimeout(3000, TimeUnit.MILLISECONDS);
driver.get("http://www.baidu.com");
//设置元素定位超时等待时间,全局设置,作用于driver,对所有后续元素定位都有效
driver.manage().timeouts().implicitlyWait(3000, TimeUnit.MILLISECONDS);
WebElement element=driver.findElement(By.xpath("kw"));
3. 显示等待
WebDriverWait wait=new WebDriverWait(driver, 2);
wait.until(new ExpectedCondition() {
public Boolean apply(WebDriver d) {
boolean loadcomplete = d.findElement(By.xpath("")).isDisplayed();
return loadcomplete;
}
});