一、定位页面元素
1、高级定位:层级定位
思路:先定位到祖先节点,在定位该祖先节点范围内的子节点
2、高级定位:Xpath定位(重点)
(1)Xpath定位:Xpath就是一个表达式,表示元素的路径,在XML文档中通过描述节点的路径来查找节点的技术,因为XML和HTML语法相似,所以Xpath也可以用在HTML文档中
(2)Xpath表达式有两种方式:
a.绝对路径:完整的路径,不建议使用
b.相对路径:相对于某个节点的路径,可维护性好
(3)获取Xpath表达式
a.打开被测系统,显示出要定位的元素
b.F12快捷键显示Firebug面板,切换到FirePath选项卡
c.使用第二个按钮"点击查看页面中的元素"
d.在被测系统点击要获取xpath的元素
e.在firepath的xpath表达式文本框中复制xpath表达式
说明:
a.Firebug:是火狐浏览器的一个插件,用于查看页面源代码,便于定位到关心的页面元素的源代码
b.Firepath:是Firebug的插件,用于查看和校验xpath表达式
练习1:使用xpath定位方式点击"登录"和"查看购物车"
二、查找页面元素的方法
1、findElement方法
(1)作用:获得符合定位条件的第一个元素
(2)返回值:WebElement页面元素
(3)语法:
WebElement we = driver.findElement(By.xxx("xxx"))we.click();
2、findElements方法
(1)作用:获取符合定位条件的所有页面元素
(2)返回值:由多个WebElement组成的List列表
(3)语法:
List<WebElement> allWe = driver.findElements(By.xxx("xxx"));
练习2:获取所有商品的个数
a.输入"手机"
b.点击"搜索"按钮
c.获取所有商品的个数
三、常用的对象以及常用的方法
1、WebDriver对象
(1)get方法
a.作用:获取指定URL的网页,在浏览器中打开指定的url对应的网页
b.语法:driver.get("url");
(2)quit方法:
a.作用:退出浏览器
b.语法:driver.quit();
(3)getTitle方法
a.作用:获取当前网页的标题
b.语法:String t = driver.getTitle();
2、WebElement对象:页面元素
(1)click方法:
a.单击页面元素,一般操作按钮、链接、图片
b.语法:we.click();
如:driver.findElement(By.name("submit")).click();
(2)sendKeys方法:
a.输入数据到指定的页面元素中
b.语法:we.sendKeys("testing");
如:driver.findElement(By.name("username")).sendKeys("testing");
(3)clear方法:
a.清空指定的页面元素
b.语法:we.clear();
如:driver.findElement(By.name("username")).clear();
(4)getText方法:
a.获取指定页面元素的文本
b.语法:String text = we.getText();
练习3:获取"欢迎光临本店"文本,对它进行验证
(5)getAttribute方法
a.获取指定页面元素的指定属性的值
b.语法:String v = we.getAttribute("属性名称");
练习4:
练习5:点击Ecshop首页的"注册"按钮
练习6:向Ecshop用户名输入框中输入testing
a.获取到页面中所有的输入框元素
b.在所有输入框元素遍历出用户名输入框
c.遍历出后输入testing
(6)isSelected方法
a.获得复选框或单选按钮是否处于被选中的状态
b.语法:boolean s=we.isSelected();
3、Alert对象:提示框
(1)封装Alert对象(切换到提示框,对提示框进行操作)
Alert a = driver.switchTo().alert();
(2)getText方法
a.获取提示框中的文本信息
b.语法:String t = a.getText();
(3)accept方法:
a.在提示框中点击"确认"按钮
b.语法:a.accept();
(4)dismiss方法:
a.在提示框中点击"取消"按钮
b.语法:a.dismiss();
练习7:
a.不输入任何内容点击"立即登陆"按钮,验证提示信息框是否出现和提示信息是否正确
b.输入用户名,点击"立即登陆"按钮,验证提示信息框是否出现和提示信息是否正确
4、Select对象:下拉框元素
(1)封装Select对象
Select s = new Select(driver.findElement(By.XX("XXX")));
(2)selectByVisibleText方法
a.通过选项的可见文本来选择
b.语法:s.selectByVisibleText("手机类型")
(3)selectByIndex方法
a.通过选项的下标选择选项,下标从0开始
b.语法:s.selectbyIndex(5);
(4)selectByValue方法
a.通过选项值来选择,选项值是指option标签元素中的value属性的值,是一个字符串
b.s.selectByValue("5");
(5)getFirstSelectedOption方法
a.获取选中的下拉框选项
b.语法:WebElement we = s.getFirestSelectedOption();
(6)getOptions方法
a.获取所有的下拉框选项
b.语法:List<WebElement> all = s.getOptions();
练习8:输入关键字a,点击搜索按钮,在搜索结果右上角的排序下拉框中进行操作
a.断言默认选项是否为"按上架时间排序"getFirestSelectedOption
b.选择"按价格排序"selectByVisibleText
c.选择包含"更新时间"的选项getOptions
Junit代码 package com.day06.www; import java.util.List; import java.util.regex.Pattern; import java.util.concurrent.TimeUnit; import org.junit.*; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.Select; public class TestECshop { private WebDriver driver; private String baseUrl; //如果要点击"取消"按钮,就把true改成false private boolean acceptNextAlert = true; private StringBuffer verificationErrors = new StringBuffer(); @Before public void setUp() throws Exception { driver = new FirefoxDriver(); baseUrl = "http://localhost/"; //打开被测系统 driver.get(baseUrl+"/ws/ecshop/upload/index.php"); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } @Test public void testUntitled() throws Exception { //driver.get(baseUrl + "/ws/ecshop/upload/index.php"); //使用层级定位方式定位"注册"按钮,无法定位 //使用Xpath driver.findElement(By. xpath(".//*[@id='ECS_MEMBERZONE']/a[2]/img")). click(); Thread.sleep(5000); //driver.findElement(By.cssSelector("#ECS_MEMBERZONE > a > img")).click(); //使用层级定位方式定位"登录"按钮 //driver.findElement(By.id("ECS_MEMBERZONE")). //findElement(By.tagName("img")).click(); //使用xpath登录"登录"按钮 driver.findElement(By. xpath(".//*[@id='ECS_MEMBERZONE']/a[1]/img")). click(); WebElement uname = driver.findElement(By.name("username")); uname.clear(); uname.sendKeys("testing"); //driver.findElement(By.name("username")).clear(); //driver.findElement(By.name("username")).sendKeys("testing"); WebElement passwd = driver.findElement(By.name("password")); passwd.clear(); passwd.sendKeys("123456"); //driver.findElement(By.name("password")).clear(); //driver.findElement(By.name("password")).sendKeys("123456"); driver.findElement(By.name("submit")).click(); driver.findElement(By.linkText("退出")).click(); //driver.findElement(By.linkText("查看购物车")).click(); //使用层级定位方式定位"查看购物车" //driver.findElement(By.id("topNav")). //findElement(By.tagName("a")).click(); //使用xpath定位方式定位"查看购物车" driver.findElement(By. xpath(".//*[@id='topNav']/a[1]")). click(); Thread.sleep(5000); } @Test public void testSearch(){ //打开被测系统 //driver.get(baseUrl+"/ws/ecshop/upload/index.php"); //在搜索输入框中输入"手机" driver.findElement(By.id("keyword")). sendKeys("手机"); //点击"搜索"按钮 driver.findElement(By.name("imageField")). click(); //获取商品的个数 List<WebElement> allItem = driver.findElements(By. className("goodsItem")); System.out.println(allItem.size()); } @Test public void testWebDriver(){ //get方法 // //http://localhost/ws/ecshop/upload/index.php //driver.get(baseUrl+"ws/ecshop/upload/index.php"); //getTitle String t = driver.getTitle(); assertEquals("ECSHOP演示站 - Powered by ECShop",t); } @Test public void testGetText() throws InterruptedException{ //打开被测系统 //driver.get(baseUrl+"/ws/ecshop/upload/index.php"); //等待一会儿 Thread.sleep(3000); //获取页面中"欢迎光临本店"文本 String t; t = driver.findElement(By. id("ECS_MEMBERZONE")). getText(); // System.out.println(t); //验证 //assertEquals("欢迎光临本店",t); assertTrue(t.contains("欢迎光临本店")); } @Test public void testGetAttribute() throws InterruptedException{ //点击"登录"按钮 driver.findElement(By. xpath(".//*[@id='ECS_MEMBERZONE']/a[1]/img")). click(); //输入用户名:testing driver.findElement(By. name("username")). sendKeys("testing"); //使用getAttribute获取testing放在uv String uv; uv=driver.findElement(By. name("username")). getAttribute("value"); //输入密码:123456 driver.findElement(By. name("password")). sendKeys("123456"); //点击"立即登陆"按钮 driver.findElement(By. name("submit")). click(); Thread.sleep(5000); //获取登录后页面显示的testing放在tv String tv; tv = driver.findElement(By. className("f4_b")). getText(); //验证tv是否等于uv assertTrue(tv.contains(uv)); //点击"退出"按钮 driver.findElement(By. linkText("退出")).click(); } @Test public void testClickReg() throws InterruptedException{ //该方法实现点击Ecshop注册按钮 //1.使用层级定位找到符合条件的所有img对象 List<WebElement> imgs = driver. findElement(By.id("ECS_MEMBERZONE")). findElements(By.tagName("img")); //2.从imgs中进行遍历,判断哪个元素的src属性包含reg //遍历:for //判断:if //获取src属性:getAttribute方法 //包含:contains方法 //for(int i;i>10;i++){ //} for(WebElement img:imgs){ if(img.getAttribute("src").contains("reg")){ img.click(); Thread.sleep(5000); break; } } } @Test public void testInput(){ //点击"登录"按钮 driver.findElement(By. xpath(".//*[@id='ECS_MEMBERZONE']/a[1]/img")). click(); //获取Input对象 List<WebElement> inputs = driver.findElements(By. tagName("input")); //找到用户名输入框,输入testing for(WebElement input:inputs){ if(input.getAttribute("name"). contains("username")){ input.sendKeys("testing"); break; } } } @Test public void testIsSelected() throws InterruptedException{ //点击"诺基亚N85" driver.findElement(By. linkText("诺基亚N85")). click(); //判断黑色单选按钮是否选中 assertTrue(driver.findElement(By. id("spec_value_163")). isSelected()); //判断蓝牙耳机复选框是否选中,未选中,就去选中 WebElement ly = driver.findElement(By. id("spec_value_158")); if(!ly.isSelected()){ ly.click(); } //判断数据线复选框是否选中,未选中,就去选中 WebElement sjx = driver.findElement(By. id("spec_value_159")); if(!sjx.isSelected()){ sjx.click(); } //判断线控耳机复选框是否选中,未选中,就去选中 WebElement xkej = driver.findElement(By. id("spec_value_157")); if(!xkej.isSelected()){ xkej.click(); } Thread.sleep(5000); } @Test public void testAlert() throws InterruptedException{ //点击"搜索"按钮 driver.findElement(By. className("go")).click(); Thread.sleep(7000); //判断提示框是否出现 assertTrue(isAlertPresent()); //判断提示信息是否为:请输入搜索关键词 assertTrue(closeAlertAndGetItsText(). contains("请输入搜索关键词")); //关闭提示框,点击确认 closeAlertAndGetItsText();//默认点击确认按钮 /* //切换鼠标到提示框 Alert a = driver.switchTo().alert(); //断言弹框信息是否为"请输入搜索关键词" assertTrue(a.getText(). contains("请输入搜索关键词")); //点击弹框"确认"按钮 a.accept();//点击确认按钮 //a.dismiss();//点击取消按钮 */ } @After public void tearDown() throws Exception { driver.quit(); String verificationErrorString = verificationErrors.toString(); if (!"".equals(verificationErrorString)) { fail(verificationErrorString); } } //判断元素是否出现 private boolean isElementPresent(By by) { try { driver.findElement(by); return true; } catch (NoSuchElementException e) { return false; } } //判断提示框是否出现 private boolean isAlertPresent() { try { driver.switchTo().alert(); return true; } catch (NoAlertPresentException e) { return false; } } //关闭提示框并且获取提示信息 private String closeAlertAndGetItsText() { try { Alert alert = driver.switchTo().alert(); String alertText = alert.getText(); if (acceptNextAlert) { alert.accept(); } else { alert.dismiss(); } return alertText; } finally { acceptNextAlert = true; } } }