自动化测试

Selenium3-UI自动化测试

学习计划

8.16-8.19完成

学习进度

8.16

selenium自动化建议

1、熟练掌握xpath\CSS定位的使用,这样在遇到各种难以定位的问题时才不会变得束手无策
2、准备一份WebDriver API文档,以便随时查阅WebDriver的方法();
3、学习掌握JavaScript、jQuery技术,它可以让我们使用该技术去操作web页面。

public static void init(){
    System.setProperty("webdriver.chrome.driver","D:\\WebDriver\\bin\\chromedriver.exe")
    WebDriver driver = new ChromeDriver();
    driver.get("http://www.baidu.com");
    driver.close();
}

一、WebDriverAPI

一、元素定位

引入--https://blog.csdn.net/qq_37546891/article/details/78998954
10大元素定位方法

findElement(By.id())  //通过id属性来定位获取元素
findElement(By.name()  //通过name属性来定位获取元素
findElement(By.className) //通过class属性来定位元素
findElement(By.tagName)//通过元素的 tag name来定位元素
findElement(By.LinkText) //通过元素标签对之间的文本信息来定位元素
findElement(By.partialLinkText) // 通过元素标签对之间的部分文件信息定位元素
findElement(By.xpath) // 通过xpath语言定位元素
findElement(By.cssSelector) //用于css语言定位元素

WebElement接口方法

WeElement webelement = findElement(By.id());
webelement.getSize(); //返回元素的尺寸
webelement.geText(); //获取页面文本信息
webelement.getAttribute(); //获取元素属性
webelement.isDisplayed(); //判断元素是否显示

二、控制浏览器

WebDriver driver  = new ChromWebDriver();
driver.manage().window().setSize() //设置浏览器窗口全屏
driver.navigate().forward() //浏览器前进
driver.navigate().back() //浏览器后退
driver.refresh() //模拟浏览器刷新

三、控制鼠标

WebDriver driver = new ChromeDriver();
WebElement search_setting = driver.findElememt(By.LinkText("设置"));
Actions action = new Actions(driver);
//鼠标操作常用方法:
action.contextClick();//右击
action.clickAndHold(search_setting).perform();//鼠标点击并控制,模拟鼠标悬停操作
// perform(),执行所有ActionChains中存储得行为,是对整个操作的提交动作

//释放鼠标
action.release().perform();

四、控制键盘

WebDriver driver  = new ChromWebDriver();
WebElement input = driver.findElement(By.id("kw"));

try{
    //输入框输入内容
    input.sendKeys("seleniumm");
    Thread.sleep(3000);
    //删除多输入的一个m
    input.sendKeys(Keys.BACK_SPACE);
    Thread.sleep(3000);
    //输入空格键+"教程"
    input.sendkeys(Keys.SPACE);
    input.sendKeys("教程");
    Thread.sleep(3000);
    //全选输入框内容 ctr+a
    input.sendKeys(Keys.CONTROL,"a");
    Thread.sleep(3000);
    //剪切输入框内容 ctr+x
    input.sendKeys(Keys.CONTROL,"x");
    Tnread.sleep(3000);
    //粘贴内容到输入框 ctr+v
    input.sendKeys(Keys.CONTROL,"v");
    Thread.sleep(3000);
    //通过店家键盘代替回车操作
    input.sendKeys(Keys.ENTER);
    Thread.sleep(3000);
}catch(Exception e){
    throw e;
}

五、常见元素处理

按钮:click(点击) isEnabled
表单:submit(回车,提交表单)
上传文件:sendkeys(模拟按键输入)
输入框:sendkeys clear getAttribute
单选框:click clear(清除文本) isSelected
多选框:click clear isSelected isEnabled

六、获得验证信息

WebDricer driver = new ChromeDriver();
driver.get("https://www.baidu.com");
System.out.println("Search Before");
//获取当前得URL和title
System.out.println(driver.getCurrentUrl());
System.out.println(driver.getTitle());

//百度搜素
try{
    WebElement search = driver.findElement(By.id("kw"));
    search.sendKeys("Selenuim");
    search.sendKeys(Keys.ENTER);
    Thread.sleep(2000);
}catch(Exception e){
    throws e;
}
System.out.println("Search After");
//获取当前得URL和title
System.out.println(driver.getCurrentUrl());
System.out.println(driver.getTitle());
//获取第一条搜索结果得标题
WebElement result = driver.findElement(By.xpath(""));
System.out.println(result.getText());

七、设置元素等待

1、自定义元素超时
页面上得元素并不是同时被加载出来的,如果因为在加载某个元素因为延迟而定位失败,那么会降低自动化脚本的稳定性,可以设置元素等待提高稳定性。

private  static boolean isElementPresent(WebDriver driver,By el){
    try{
        driver.findElement(el);
        return true;
    }catch(NoSuchElementException e){
        return false;
    }
}

public static void main(string []args){
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.baidu.com");
    //循环判断某元素是否存在
    By el = By.id("kw");
    for(int second = 1;second<=10;second++){
        System.out.println(second);
        //调用isElementPresent方法判断元素是否存在
        if(isElementPresent(driver,el)){
            break;
        }else{
            Thread.sleep(1000);
        }
        if(second==10){
            System.out.println("time is Out!");
        }
    }
    driver.findElement(el).sendKeys("selenuim");
    driver.findElement(By.id("su")).click();
    Thtread,sleep(2000);

    driver.quit;
    System.out.println("end Selenium");
}

2、显示等待方法

WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
//设置显示等待
WebDriverWait wait = new WebDriverWait(driver,10,1);
wait.until(new ExpectedCondition<WebElement>(){
    public WebElement apply(WebDriver text){
        return text.findElement(By.id("kw"));
    }).sendKeys("selenium");
    driver.findElement(By.id("su")).click();
    Thread.sleep(2000);
    driver,quit();
}

3、隐士等待方法

WebDriver driver  = new ChromeDriver();
//页面超时时间设置为5秒
driver.manage().timeouts().pageLoadTimeout(5,TimeUint.SECONDS);
driver.get("http://wwww.baidu.com");
//定位对象时给10秒的操作时间,如果超过10秒还定位不带则抛出异常
dricer.manage().timeouts().implicitlyWait(10,TimeUint.SECONDS);
driver.findElement(By.id("kw")).sendKeys("selenium");
//异步脚本的超时时间设置为3s
driver.manage().timeouts().serScriptTimeout(3,TimeUnit.SECONDS);
driver.quit();

八、定位一组元素

findElements(By.id())  //通过id属性来定位获取元素
findElements(By.name()  //通过name属性来定位获取元素
findElements(By.className) //通过class属性来定位元素
findElements(By.tagName)//通过元素的 tag name来定位元素
findElements(By.LinkText) //通过元素标签对之间的文本信息来定位元素
findElements(By.partialLinkText) // 通过元素标签对之间的部分文件信息定位元素
findElements(By.xpath) // 通过xpath语言定位元素
findElements(By.cssSelector) //用于css语言定位元素

定位一组元素一般用于以下场景:

  • 批量操作元素,例如勾选页面上的所有的复选框按钮
  • 先获取一组元素,再从这组对象中过滤出需要操作的对象

二、Selenuims实战

WebDriverMaven.java

package com.WebDriver.practice;

import com.WebDriver.util.ProUtil;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

/**
 * @Author: 陈前景
 * @DATE2022/10/18 19:24
 */
public class WebDriverMaven {
    private WebDriver driver;

    public void initWebDriver() {
        System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver.exe");
        driver = new ChromeDriver();
        driver.get("https://www.imooc.com/user/newlogin");
        driver.manage().window().maximize();
        try {
            Thread.sleep(3000);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void closeWebDriver(){
        driver.close();
    }

    public void login(String userName,String password){
        WebElement userNameElement = getElement("username");
        WebElement passwordElement = getElement("password");
        WebElement btnElement = getElement("btnlogin");
        userNameElement.sendKeys(userName);
        passwordElement.sendKeys(password);
        btnElement.click();
        try {
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        try {
            WebElement userpng = getElement("userpng");
            Actions actions = new Actions(driver);
            actions.moveToElement(userpng).perform();
            String userinfo = getElement("userinfo").getText();
            System.out.println(userinfo);
            if(userinfo.equals("程序猿candq")){
                System.out.println("登录成功");
            }else {
                System.out.println("用户不存在"+userinfo);
            }

        }catch (Exception e){
            System.out.println("登录失败");
        }

    }

    public By getBylocal(String getBy,String getValue){
        if (getBy.equals("id")){
            return By.id(getValue);
        }else if (getBy.equals("name")){
            return By.name(getValue);
        }else if(getBy.equals("className")){
            return By.className(getValue);
        }else {
            return By.xpath(getValue);
        }

    }

    public WebElement getElement(String key){
        ProUtil proUtil = new ProUtil("/element.properties");
        String getBy = proUtil.getPro(key).split(">")[0];
        String getValue = proUtil.getPro(key).split(">")[1];
        WebElement element = driver.findElement(getBylocal(getBy, getValue));
        return element;
    }

    public static void main(String[] args) {
        WebDriverMaven webDriverMaven = new WebDriverMaven();
        webDriverMaven.initWebDriver();
        webDriverMaven.login("账号","密码");
        webDriverMaven.closeWebDriver();

    }

}

ProUtil.java

package com.WebDriver.util;

import java.io.FileInputStream;
import java.net.URLDecoder;
import java.util.Properties;

/**
 * @Author: 陈前景
 * @DATE2022/10/18 20:55
 */
public class ProUtil {

    private Properties pro;

    public ProUtil(String filePath){
        pro = this.readProperties(filePath);
    }

    private Properties readProperties(String filePath){

        Properties properties = new Properties();
        String path = ProUtil.class.getResource(filePath).getPath();
        try {
            path = new URLDecoder().decode(path,"UTF-8");
            properties.load(new FileInputStream(path));
        }catch (Exception e){
            e.printStackTrace();
        }
        return properties;

    }

    public String getPro(String key){
        if(pro.containsKey(key)){
            return pro.getProperty(key);
        }else {
            return "元素不存在";
        }

    }

    public static void main(String[] args) {
        ProUtil proUtil = new ProUtil("/element.properties");
        System.out.println(proUtil.getPro("username"));
        System.out.println(proUtil.getPro("password"));
        System.out.println(proUtil.getPro("btnlogin"));

    }
}

element.properties

username=name>email
password=name>password
btnlogin=className>moco-btn-lg
userpng=id>header-avator
userinfo=className>text-ellipsis

留言