Selenium介紹
1)框架底層使用JavaScript模擬真實用戶對瀏覽器進行操作。測試腳本執行時,瀏覽器自動按照腳本代碼做出點擊,輸入,打開,驗證等操作,就像真實用戶所做的一樣,從終端用戶的角度測試應用程序。
2)使瀏覽器兼容性測試自動化成為可能,盡管在不同的瀏覽器上依然有細微的差別。
3)使用簡單,可使用Java,Python等多種語言編寫用例腳本。
使用自動化腳本刪除網站通知
使用Actions工具模擬鼠標鍵盤事件
Actions里面的函數 | 作用 |
---|---|
moveToElement | 將鼠標移動到指定的元素 比如:action.moveToElement(target).perform(); |
sendKeys | 往活動的元素里面輸入內容 比如:action.sendKeys(Keys.ENTER).perform(); |
keyDown | 按下修飾鍵(比如Ctrl,Alt,Shift等) 比如:action.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform(); |
keyUp | 釋放按鍵,比如: action.keyDown(keys.CONTROL).sendKeys(Keys.F5).keyUp(Keys.CONTROL).perform(); |
dragAndDrop | 模擬拖拽,比如: action.dragAndDrop(element,target).perform(); |
doubleClick | 雙擊鼠標,雙擊控件 |
clickAndHold | 按住鼠標左鍵不放,按住控件不放 |
release | 松開按鍵,釋放按鍵 |
【參考】修飾鍵
https://www.beichengjiu.com/computerscience/339567.html
自動化代碼如下:
package day06;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
public class DeleteTest2 {
public static void main(String[] args) throws Exception {
//設置火狐瀏覽器執行文件的路徑
System.setProperty("WebDriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//隱性等待
driver.get("http://192.168.0.124:8090/phpwind/index.php?m=u&c=login");//打開登錄的頁面
driver.findElement(By.id("J_u_login_username")).sendKeys("OIXYOAMFan");//輸入賬號
driver.findElement(By.id("J_u_login_password")).sendKeys("123456");//輸入密碼
driver.findElement(By.className("btn_submit")).click();//點擊登錄
Thread.sleep(3000);
//請求通知列表頁面
driver.get("http://192.168.0.124:8090/phpwind/index.php?m=message&c=notice");
//找到所有的通知框
List<WebElement> boxes = driver.findElements(By.className("J_notice_item"));
Actions action = new Actions(driver);
//
for(int i=0;i<boxes.size();i++) {
//根據className查找方式找到第1個通知框
WebElement target= driver.findElement(By.className("J_notice_item"));
action.moveToElement(target).perform();
action.moveToElement(driver.findElement(By.linkText("刪除"))).click().perform();
action.moveToElement(driver.findElement(By.className("J_btn_ok"))).click().perform();
Thread.sleep(2000);
}
}
}
使用自動化腳本發送彈幕
自動化代碼如下:
package day06;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class DanmuTest {
public static void main(String[] args) throws Exception{
//設置火狐瀏覽器執行文件的路徑
System.setProperty("WebDriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
//
WebDriver driver = new FirefoxDriver();
//
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://www.acfun.cn/login");
//
driver.findElement(By.linkText("帳號登錄")).click();
//
driver.findElement(By.id("ipt-account-login")).sendKeys("17721038951");
driver.findElement(By.id("ipt-pwd-login")).sendKeys("123456");
driver.findElement(By.className("btn-login")).click();
Thread.sleep(3000);
//
driver.get("https://www.acfun.cn/v/ac10343293");
for(int i=0;i<10;i++){
driver.findElement(By.className("danmu-input")).sendKeys(System.currentTimeMillis()+"到此一游");
driver.findElement(By.className("send-btn")).click();
Thread.sleep(3000);
}
}
}
對注冊功能進行自動化測試
自動化代碼如下:
package day06;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class RegisterTest {
private WebDriver driver;
// 登錄頁面的請求地址
private String url = "http://192.168.0.124:8090/phpwind/index.php?m=u&c=register";
// 注銷請求的地址
private String logout_url = "http://192.168.0.124:8090/phpwind/index.php?m=u&c=login&a=logout";
private By b1 = By.id("J_reg_username"); // 表示帳號輸入框的查找方式
private By b2 = By.id("J_reg_password"); // 表示密碼輸入框的查找方式
private By b3 = By.id("J_reg_repassword");//表示確認密碼的查找方式
private By b4 = By.id("J_reg_email");//郵箱輸入框的查找方式
private By b5 = By.className("btn_submit");//表示注冊按鈕的查找方式
@BeforeMethod
public void logout() {
driver.get(logout_url);// 注銷
}
/**
* 注冊成功的測試用例
*
* @param b6 表示注冊成功提示框的查找方式
* @param user 表示帳號
* @param pwd 表示登錄密碼
* @param pwd2
* @param email
* @param expected
*/
@Test(dataProvider = "dp")
public void register_success(By b6, String user, String pwd, String pwd2, String email, String expected) {
driver.get(url);// 打開登錄的頁面
driver.findElement(b1).sendKeys(user);// 輸入賬號
driver.findElement(b2).sendKeys(pwd);// 輸入密碼
driver.findElement(b3).sendKeys(pwd);// 輸入確認密碼
driver.findElement(b4).sendKeys(email);// 輸入郵箱
driver.findElement(b5).click();// 點擊注冊
Assert.assertTrue(driver.findElement(b6).getText().contains(expected));
}
/**
* 注冊失敗的測試用例
*
* @param b7 表示錯誤信息提示框的查找方式
* @param user 表示帳號
* @param pwd 表示登錄密碼
* @param pwd2
* @param email
* @param expected 表示期望的內容
*/
@Test(dataProvider = "dp2", enabled = true)
public void register_fail(By b7, String user, String pwd, String pwd2, String email, String expected) throws Exception{
driver.get(url);// 打開注冊的頁面
driver.findElement(b1).sendKeys(user);// 輸入賬號
driver.findElement(b2).sendKeys(pwd);
driver.findElement(b3).sendKeys(pwd2);
driver.findElement(b4).sendKeys(email);// 輸入郵箱
driver.findElement(b3).click();
Thread.sleep(500);
driver.findElement(b5).click();//
Thread.sleep(500);
Assert.assertTrue(driver.findElement(b7).getText().contains(expected));
}
/**
* 注冊成功的數據源
*
* @return
*/
@DataProvider
public Object[][] dp() {
return new Object[][] { new Object[] { By.xpath("/html/body/div/div[2]/div/div/h1"), getRandomString(10),
"123456", "123456", getRandomString(10) + "@qq.com", "恭喜您" } };
}
/**
* 注冊失敗的數據源
*
* @return
*/
@DataProvider
public Object[][] dp2() {
return new Object[][] {
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_username\"]/span"), "", "123456", "123456",
"155555@qq.com", "用戶名不能為空" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_password\"]/span"), "ytre", "", "123456", "155555@qq.com",
"密碼不能為空" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_repassword\"]/span"), "sdgd", "123456", "",
"155555@qq.com", "確認密碼不能為空" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_email\"]/span"), "sdgd", "123456", "123456", "",
"郵箱不能為空" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_username\"]/span"), "asd1", "123456", "123456",
"155555@qq.com", "用戶名已經存在" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_password\"]/span"), "sdgd", "123", "123456",
"155555@qq.com", "密碼長度錯誤" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_repassword\"]/span"), "sdgd", "123456", "1234",
"155555@qq.com", "兩次輸入的密碼不一致" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_email\"]/span"), "sdgd", "123456", "123456", "1555asd",
"請輸入正確的電子郵箱地址" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_email\"]/span"), "sdgd", "123456", "123456",
"1506322725@qq.com", "該郵箱地址已經被注冊" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_password\"]/span"), "sdgd", "1234567890123456", "123456",
"155555@qq.com", "密碼長度錯誤" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_username\"]/span"), "sd", "123456", "123456",
"155555@qq.com", "用戶名長度錯誤" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_username\"]/span"), "s d", "123456", "123456",
"155555@qq.com", "用戶名含有非法字符" },
new Object[] { By.xpath("http://*[@id=\"J_reg_tip_username\"]/span"), "qwertyuiasdghjkjg", "123456",
"123456", "155555@qq.com", "用戶名長度錯誤" } };
}
@BeforeClass
public void beforeClass() {
// 設置火狐瀏覽器執行文件的路徑
System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
//
driver = new FirefoxDriver();
// 設置最大等待時長
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// 最大化窗口
driver.manage().window().maximize();
}
@AfterClass
public void afterClass() throws Exception {
Thread.sleep(2000);
// 關閉瀏覽器
driver.quit();
}
/**
* 生成隨機字符串
*
* @param length 表示隨機字符串里面的字符個數
* @return
*/
public static String getRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
}
日期控件的操作
自動化代碼如下:
package examples;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
public class Test12306 {
private WebDriver driver;
@AfterClass
public void end() throws Exception{
Thread.sleep(2000);
driver.quit();
}
@Test
public void f() throws Exception{
//設置火狐瀏覽器執行文件的路徑
//System.setProperty("WebDriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
//WebDriver driver = new FirefoxDriver();
driver = new EdgeDriver();
Actions action = new Actions(driver);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);//隱性等待
driver.manage().window().setSize(new Dimension(1366, 1080));//設置瀏覽器窗口大小
driver.get("https://www.12306.cn/index/");//打開頁面
action.moveToElement(driver.findElement(By.id("fromStationText"))).click().perform();
Thread.sleep(500);
driver.findElement(By.id("fromStationText")).clear();
Thread.sleep(500);//顯性等待
driver.findElement(By.id("fromStationText")).sendKeys("sh");
//
driver.findElement(By.id("citem_0")).click();
//
driver.findElement(By.id("toStationText")).click();
driver.findElement(By.id("toStationText")).clear();
driver.findElement(By.id("toStationText")).sendKeys("gz");
Thread.sleep(500);//顯性等待
WebElement target = driver.findElement(By.id("citem_2"));//定位廣州
action.moveToElement(target).click().perform();//點擊廣州
driver.findElement(By.id("isHighDan")).click();//勾選高鐵
driver.findElement(By.id("train_date")).click();
Thread.sleep(1500);//顯性等待,可以注釋掉
//driver.findElement(By.xpath("/html/body/div[11]/div[1]/div[2]/div[17]/div")).click();
driver.findElement(By.cssSelector("div.cal:nth-child(1) > div:nth-child(3) > div:nth-child(18) > div:nth-child(1)")).click();
Thread.sleep(1500);//顯示等待,可以注釋掉
driver.findElement(By.id("search_one")).click();//點擊查詢
}
}
使用自動化腳本上傳頭像
上傳控件是file類型的input控件(非flash控件的情況)
driver.findElement(By.name("avatar")).sendKeys("d:\\123.jpg");
driver.findElement(By.id("J_avatgar_normal_btn")).click();
上傳控件是flash控件的情況(swf文件里面的控件)
swf為上傳頭像的flash文件,該文件需要使用flash插件打開
方案1:
1)向flex工程注入SeleniumFlexAPI.swc,重新生成flash文件(swf文件)
2)自動化腳本里面引入user-extensions.js,然后通過調用js的接口來控制flash
方案2:
使用AutoIT(界面自動化工具)和Robot(鍵盤事件模擬)
方案3:
使用sikuli(圖像識別工具)
//未完成
【參考】selenium自動化過程中如何操作Flash控件
https://www.cnblogs.com/hhudaqiang/p/6673012.html
【參考】js調用flash中定義的方法
http://www.phpvar.com/archives/2769.html
【參考】selenium對flex的支持
https://m.ancii.com/azmj5pu7l/
【參考】擴展Selenium對于Flash(Flex)元素識別和操作的實踐小結
https://blog.csdn.net/wanglha/article/details/39135469
瀏覽器導航事件模擬(刷新、前進、后退)
Selenium代碼如下:
driver.navigate().refresh();//刷新
driver.navigate().back();//后退
driver.navigate().forward();//前進
普通下拉框操作(select控件)
select控件的html代碼如下:
<select name="bYear">
...
<option value="1997">1997年</option>
<option value="1996">1996年</option>
<option value="1995">1995年</option>
...
</select>
selenium代碼如下:
WebElement target = driver.findElement(By.name("bYear"));
//創建一個選擇器
Select select = new Select(target);
//選擇1996
//select.selectByVisibleText("1996年");
//select.selectByIndex(24);
select.selectByValue("1996");
確認對話框操作(確認和取消)
1)通過js實現的彈窗(使用confirm函數或者alert函數實現的彈窗)
//切換到彈窗
Alert dialog = driver.switchTo().alert();
//dialog.accept();//確定
dialog.dismiss();//取消
dialog.getText();//獲取提示框里面的提示信息
2)使用div實現的提示框怎么操作
driver.findElement(By.linkText("刪除")).click();
//點擊確定
driver.findElement(By.className("J_btn_ok")).click();
框架切換
1)先切到默認的html文檔
//回到默認的html文檔
driver.switchTo().defaultContent();
2)然后切到目標框架(指定的框架)
//切換到框架
driver.switchTo().frame(driver.findElement(By.id("login_frame")));
切換到新打開的窗口
//切換到指定的窗口(目標窗口)
for(String handle:driver.getWindowHandles()) {
driver.switchTo().window(handle);
System.out.println(driver.getTitle());//打印窗口的標題
if(driver.getTitle().contains("登錄")) {
break;
}
}
遠程驅動各種主流瀏覽器
//獲取ie瀏覽器的配置工具
InternetExplorerOptions options = new InternetExplorerOptions();
//配置瀏覽器的名稱
options.setCapability("browser.name", "internet explorer");
//設置瀏覽器的版本
options.setCapability("platform", Platform.WINDOWS);
//解決ie瀏覽器輸入文本很慢的問題
options.requireWindowFocus();
//連接hub
driver = new RemoteWebDriver(new URL("http://192.168.0.124:4444/wd/hub"), options);
...
//獲取chrome瀏覽器的配置工具
ChromeOptions options = new ChromeOptions();
//配置瀏覽器的名稱
options.setCapability("browser.name", "chrome");
//設置瀏覽器的版本
options.setCapability("platform", Platform.WINDOWS);
//連接hub
driver = new RemoteWebDriver(new URL("http://192.168.0.124:4444/wd/hub"), options);
...
//獲取firefox瀏覽器的配置工具
FirefoxOptions options options = new FirefoxOptions();
//配置瀏覽器的名稱
options.setCapability("browser.name", "firefox");
//設置瀏覽器的版本
options.setCapability("platform", Platform.WINDOWS);
//連接hub
driver = new RemoteWebDriver(new URL("http://192.168.0.124:4444/wd/hub"), options);
Selenium API文檔(Java版使用說明書)
https://seleniumhq.github.io/selenium/docs/api/java/index.html?index-all.html
微信掃一掃關注該公眾號【測試開發者部落】
點擊鏈接加入群聊【軟件測試學習交流群】
https://jq.qq.com/?_wv=1027&k=5eVEhfN
軟件測試學習交流QQ群號:511619105