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