• 第4章 Selenium2-java WebDriver API (一)


    4.1  从定位元素开始

    WebDriver提供了八种元素定位方:   在Java语言中对应的定位方法:

    ·id                findElement(By.id())        
    ·name              findElement(By.name())
    ·class name            findElement(By.className())
    ·tag name            findElement(By.tagName())
    ·link text              findElement(By.linkText())
    ·partial link text         findElement(By.partialLinkText())
    ·xpath              findElement(By.xpath())
    ·css selector             findElement(By.cssSeletor())

    id定位:name定位,class定位都是通过他们的属性值来的。

    link定位:专门用来定位文本链接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新闻</a>  对应的link定位 findElement(By.linkText("新闻"))。

    partial link定位:parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">这是一个很长很长的文本链接</a>  对应的partial link定位   findElement(By.partialLinkText("一个很长的"))   或  findElement(By.partialLinkText("文本链接"))。

    xpath定位:最简单的找到元素的位置的方法就是打开FireBug。

     CSS定位:<span class="sp">

                        <input id="abc" name="def" class="ghi" type="text" maxlength='100' />

                   </span>

         通过class属性定位:findElement(By.cssSelector(".ghi"));

         通过id属性定位:findElement(By.cssSelector("#abc"));

         通过标签名定位:findElement(By.cssSelector("input"));

       通过父子关系定位: findElement(By.cssSelector("span > input"));

         通过属性定位:findElement(By.cssSelector("input[maxlength='100']"));

    XPath与CSS的类似功能的简单对例如下表所示

        

    package com.cy.selenium;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.Keys;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.interactions.Actions;
    
    import bsh.commands.dir;
    
    
    public class Test01 {
        public static void main(String[] args) {       
            System.out.println("start selenium");
            WebDriver driver=new FirefoxDriver();// 用WebDriver new Firefox浏览器的驱动给变量driver,相当于driver拿到了Firefox浏览器的控制权。
            driver.manage().window().maximize();
            driver.get("http://www.awbeci.com/");
            driver.findElement(By.xpath(".//*[@id='navbar-collapse-01']/ul[2]/li[2]/button")).click();
            driver.findElement(By.id("username")).sendKeys("SmileCy");
            driver.findElement(By.id("password")).sendKeys("1314520");
            driver.findElement(By.linkText("登录")).click();
            driver.findElement(By.xpath(".//*[@id='main-container']/div[1]/div[2]/div/div[2]/div/a[3]/span")).click();
            
            // 回车键查询
            driver.findElement(By.cssSelector(".form-control")).sendKeys("软件测试学");
            new Actions(driver).sendKeys(Keys.ENTER).perform();// 按回车键
           
            // 后退
           driver.navigate().back();
           
           // 刷新
           driver.navigate().refresh();
    
           // 关闭浏览器
            driver.close();
            
        }
    
    }

    4.2  控制浏览器

       4.2.1  控制浏览器窗口大小 

     driver.manage().window().setSize(new Dimension(400, 500));

      4.2.2  控制浏览器后退、前进

         WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮

         // 后退
           driver.navigate().back();
           
           // 刷新
           driver.navigate().refresh();

      4.2.3  模拟浏览器刷新

    driver.navigate().refresh();

    4.3  简单元素操作

    ·clear()             清除文本。
    ·sendKeys(*value)     模拟按键输入。
    ·click()             单击元素。

      4.3.2  WebElement接口常用方法

    submit()   submit()方法用于提交表单

    getSize()             返回元素的尺寸。

    getText()             获取元素的文本。

    getAttribute(name)     获得属性值。

    isDisplayed()         设置该元素是否用户可见。

    4.4  鼠标事件

    Actions 类提供了鼠标操作的常用方法:
    · contextClick()    右击
    · clickAndHold()   鼠标点击并控制
    · doubleClick()    双击
    · dragAndDrop()   拖动
    · release()        释放鼠标

    · perform()  执行所有Actions中存储的行为

    鼠标右击操作。

    导入提供鼠标操作的ActionChains 类
    Actions(driver)
    调用Actions()类,将浏览器驱动driver作为参数传入。
    contexClick(xxx)
    contextClick()方法用于模拟鼠标右键操作,在调用时需要指定元素定位。
    perform() 执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。

     action.contextClick(driver.findElement(By.className("cnisdisd"))).perform();

    鼠标悬停。clickAndHold();

     action1.clickAndHold(driver.findElement(By.linkText("设置"))).perform();

    鼠标双击操作。
    doubleClick()方法用于模拟鼠标双击操作。

     action1.doubleClick(driver.findElement(By.className(""))).perform();

    鼠标拖放操作。
    drag_and_drop(source, target)在源元素上按下鼠标左键,然后移动到目标元素上释放。
    ·source:鼠标拖动的源元素。
    ·target:鼠标释放的目标元素。

          WebElement source=driver.findElement(By.className("element"));
          WebElement target=driver.findElement(By.className("element"));
          action1.dragAndDrop(source, target).perform();

    释放鼠标
    release()方法用于释放鼠标事件。

     action1.release().perform();

    4.5  键盘事件

    使用键盘按键方法前需要先导入keys类。
    以下为常用的键盘操作:
    sendKeys(Keys.BACK_SPACE)     删除键(BackSpace)
    sendKeys(Keys.SPACE)              空格键(Space)
    sendKeys(Keys.TAB)                  制表键(Tab)
    sendKeys(Keys.ESCAPE)            回退键(Esc)
    sendKeys(Keys.ENTER)              回车键(Enter)
    sendKeys(Keys.CONTROL,'a')   全选(Ctrl+A)

    sendKeys(Keys.CONTROL,'c')   复制(Ctrl+C)
    sendKeys(Keys.CONTROL,'x')   剪切(Ctrl+X)
    sendKeys(Keys.CONTROL,'v')    粘贴(Ctrl+V)
    sendKeys(Keys.F1)                    键盘F1
    ……
    sendKeys(Keys.F12)                 键盘F12

    package com.cy.selenium;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.Keys;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    
    public class Test02 {
            public static void main(String[] args) {
                 WebDriver driver=new FirefoxDriver();
                 driver.manage().window().maximize();
                 driver.get("http://www.baidu.com/");
                 
                 WebElement input =driver.findElement(By.id("kw"));
                 // 输入内容
                 input.sendKeys("seleniumm");
                 // 删除多余的m
                 input.sendKeys(Keys.BACK_SPACE);
                 // 输入空格+教程
                 input.sendKeys(Keys.SPACE);
                 input.sendKeys("教程");
                 
                 // ctrl+a
                 input.sendKeys(Keys.CONTROL,"a");
                 
                 // ctrl+x
                 input.sendKeys(Keys.CONTROL,"x");
                 
                 // ctrl+v
                 input.sendKeys(Keys.CONTROL,"v");
                 
                 // 通过回车键 查询
                 input.sendKeys(Keys.ENTER);
                 
                 driver.close();
                 
            }
    }

    4.6  获得验证信息

    getTitle():用于获得当前页面的title。
    getCurrentUrl() :用户获得当前页面的URL。

    4.7  设置元素等待

    4.7.1 timeouts方法

    WebDriver提供了几种方法来等待元素。


    ·implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
    ·setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
    ·pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常

    4.7.2 sleep休眠方法

    Thread.sleep()方法

    当执行到sleep()方法时会固定的休眠所设置的时长(这里以毫秒为单位);然后再继续执行。
    注意,这里的Thread.sleep()方法不能直接使用,必须加上异常的处理。
    throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。  

    package com.cy.selenium;
    
    import java.util.concurrent.TimeUnit;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class Wait {
      public static void main(String[] args) {
            WebDriver driver=new FirefoxDriver();
            driver.manage().window().maximize();
            //页面加载超时时间为5s
            driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
            
            driver.get("http://www.baidu.com/");
            
             //定位对象时间5s,还没订到位置报异常
          driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);    
            driver.findElement(By.id("kww")).sendKeys("selenium");
            // Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"kww"}
            
            //异步脚本的超时时间为5s
          driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
          
          
          // Thread.sleep 需要异常处理
          try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
          
          
          
            
            driver.close();
    }
    }
  • 相关阅读:
    Chrome80调整SameSite策略对IdentityServer4的影响以及处理方案(翻译)
    IdentityServer4源码解析_4_令牌发放接口
    IdentityServer4源码解析_3_认证接口
    IdentityServer4源码解析_2_元数据接口
    IdentityServer4源码解析_1_项目结构
    AspNetCore3.1_Secutiry源码解析_8_Authorization_授权框架
    AspNetCore3.1_Secutiry源码解析_7_Authentication_其他
    AspNetCore3.1_Secutiry源码解析_6_Authentication_OpenIdConnect
    AspNetCore3.1_Secutiry源码解析_5_Authentication_OAuth
    AspNetCore3.1_Secutiry源码解析_4_Authentication_JwtBear
  • 原文地址:https://www.cnblogs.com/hellokitty1/p/6295843.html
Copyright © 2020-2023  润新知