• Selenium(6)


    一、定位页面元素
      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;
        }
      }
    }
  • 相关阅读:
    在SQL SERVER 2005中还原数据库时出现错误:system.data.sqlclient.sqlerror 媒体集有 2 个媒体簇 但只提供了 1 个。必须提供所有成员。 (microsoft.sqlserver.smo)
    Mysql的Root密码忘记,查看或修改的解决方法
    Win7系统如何设置FTP详细过程
    该设备或资源(127.0.0.1)未设置为接受端口“16823”上的连接。
    window7防火墙无法更改某些设置,错误代码0×80070422
    访问FTP站点下载文件,提示“当前的安全设置不允许从该位置下载文件”的解决方案
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
    按状态选择链接元素
    类选择器与ID选择器的比较
    关于创建Web图像时应记住的五个要素
  • 原文地址:https://www.cnblogs.com/KalosOwen/p/8977097.html
Copyright © 2020-2023  润新知