本篇文章由來,這兩天整理了下自己經常使用而且很熟練的項目,今天突然想起漏了一個,補上了,但想到還沒對應的博客,那就寫一個簡單的
我經常使用且相對熟練的部分技術如下(不知道算不算各位大神眼中的辣雞):
傳統的web項目測試,大多數都依靠測試部門小伙伴人工操作,費時費力還容易側漏`(*∩_∩*)′ 錯了 是漏測,
而selenium則為項目的測試提供了很大的便利,但並不是所有項目都適合,
哪些適合呢:公司自己的產品,且需要經常回歸測試,比如類似OA這類業務系統產品
不適合的呢:比如外包業務,快速交付后就不管的,只需要測試一兩次
案例一:一個簡單示例(無彈出框這類單一頁面),先看看執行效果(點擊圖片查看高清版本):
效果還滿意么?滿意請繼續往下看,不滿意請關閉窗口 謝謝
1.新建maven項目,引入selenium-java
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.8.1</version> </dependency>
2.寫代碼(因為自動化測試速度極快,每個步驟后我都稍微停頓了下,注釋也很清晰明了)
1 package com.xiao.selenium; 2 3 import java.util.List; 4 import java.util.Random; 5 import java.util.concurrent.TimeUnit; 6 7 import org.openqa.selenium.By; 8 import org.openqa.selenium.JavascriptExecutor; 9 import org.openqa.selenium.WebDriver; 10 import org.openqa.selenium.WebElement; 11 import org.openqa.selenium.firefox.FirefoxDriver; 12 13 public class AutoTest { 14 public static void main(String[] args) throws InterruptedException { 15 Thread.sleep(3000); 16 //System.setProperty("webdriver.chrome.driver", "c://chromedriver.exe"); 17 //WebDriver webDriver = new ChromeDriver(); 18 System.setProperty("webdriver.gecko.driver", "c://geckodriver.exe"); 19 WebDriver webDriver = new FirefoxDriver(); 20 webDriver.manage().window().maximize(); 21 webDriver.manage().deleteAllCookies(); 22 // 與瀏覽器同步非常重要,必須等待瀏覽器加載完畢 23 webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 24 25 //打開目標地址 26 webDriver.get("http://192.168.0.32:88"); 27 //輸入賬號 密碼並登陸系統 28 Thread.sleep(1000); 29 webDriver.findElement(By.xpath("/html/body/div/div/form/div[1]/div/div/input")).sendKeys("admin"); 30 webDriver.findElement(By.xpath("/html/body/div/div/form/div[2]/div/div/input")).sendKeys("123456"); 31 webDriver.findElement(By.cssSelector("html body div#app div.loginPage form.el-form.fromBox button.el-button.loginBtn.el-button--primary")).click(); 32 33 //選擇系統 34 Thread.sleep(1000); 35 webDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/p")).click(); 36 37 //展開基礎信息管理菜單 38 Thread.sleep(1000); 39 webDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/div[3]/ul/div[1]/li/div/span")).click(); 40 //點擊科室管理菜單 41 Thread.sleep(1000); 42 webDriver.findElement(By.cssSelector(".is-opened > ul:nth-child(2) > li:nth-child(1)")).click(); 43 44 //跳轉到第2頁 45 Thread.sleep(1000); 46 webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[2]/div/div[2]/ul/li[2]")).click(); 47 48 //點擊新增按鈕 49 webDriver.findElement(By.xpath("/html/body/div/div/div/div[2]/div[2]/div/div[2]/div[1]/div/div[1]/div[1]/button")).click(); 50 51 //根據規則隨機生成文本框內容 52 int random = new Random().nextInt(200000000); 53 Thread.sleep(1000); 54 webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[1]/div[1]/div/div/input")).sendKeys(String.valueOf(random)); 55 Thread.sleep(1000); 56 webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[1]/div[2]/div/div[1]/input")).sendKeys("自動化測試-"+random); 57 58 //展開下拉框 59 webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[2]/form/div[2]/div[1]/div/div/div[1]/span/span/i")).click(); 60 Thread.sleep(1000); 61 //獲取下拉框size 62 List<WebElement> select1 = webDriver.findElements(By.cssSelector("div.el-select-dropdown:nth-child(4) > div:nth-child(1) > div:nth-child(1) > ul li")); 63 //隨機選擇一個項目 64 int selectItem1 = new Random().nextInt(select1.size())+1; 65 webDriver.findElement(By.xpath("/html/body/div[3]/div[1]/div[1]/ul/li["+selectItem1+"]")).click(); 66 67 //稍作停頓,然后保存 68 Thread.sleep(1000); 69 webDriver.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/div[2]/div/div[3]/div/div[3]/div/button[1]")).click(); 70 71 //跳轉到我的博客 72 Thread.sleep(3000); 73 webDriver.get("https://www.cnblogs.com/xiaochangwei"); 74 75 webDriver.findElements(By.className("postTitle")).forEach(x -> { 76 System.out.println(x.getText()); 77 }); 78 79 Thread.sleep(1000); 80 //打開標題為 通過Dockerfile構建鏡像並發布web項目 的文章 81 webDriver.findElement(By.partialLinkText("通過Dockerfile構建鏡像並發布web項目")).click(); 82 83 Thread.sleep(1000); 84 //移動到底部 85 //((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, document.body.scrollHeight)"); 86 //移動到指定的坐標(相對當前的坐標移動) 87 ((JavascriptExecutor) webDriver).executeScript("window.scrollBy(0, 700)"); 88 Thread.sleep(1000); 89 //移動到窗口絕對位置坐標,如下移動到縱坐標1600像素位置 90 ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, 1600)"); 91 Thread.sleep(1000); 92 //移動到指定元素,且元素底部和窗口底部對齊 參考 https://www.cnblogs.com/testway/p/6693140.html 93 ((JavascriptExecutor) webDriver).executeScript("arguments[0].scrollIntoView(false);", webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div/div[1]/div/div/div[2]/div[4]/div[3]/div[1]/a[5]/img"))); 94 //暫停五秒鍾后關閉 95 Thread.sleep(2000); 96 webDriver.quit(); 97 } 98 }
其中:
16行谷歌瀏覽器的驅動下載地址:https://chromedriver.storage.googleapis.com/index.html
18行火狐瀏覽器的驅動下載地址:https://github.com/mozilla/geckodriver/releases
然后運行,你就可以為所欲為了
案列二:有彈出框及使用了Frame的頁面,以百度盤登錄為例
代碼如下:
package com.xiao.selenium; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Point; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; /** * @Title: com.xiao.selenium.BaiduPanLogin.java * @Description: * @author changw.xiao@qq.com * @date 2018年2月5日 上午9:16:44 * @version V1.0 */ public class BaiduLogin { public static void main(String[] args) throws InterruptedException { Thread.sleep(3000); System.setProperty("webdriver.gecko.driver", "c://geckodriver.exe"); WebDriver driver = new FirefoxDriver(); // driver.manage().window().maximize(); driver.manage().window().setPosition(new Point(100, 50)); driver.manage().deleteAllCookies(); // 與瀏覽器同步非常重要,必須等待瀏覽器加載完畢 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://pan.baidu.com/"); Thread.sleep(1000); WebElement qqLoginLink = driver .findElement(By.xpath("/html/body/div[1]/div[3]/div[6]/div/div[4]/div[2]/div/ul/li[2]/a")); qqLoginLink.click(); Thread.sleep(1000); // 獲取當前頁面句柄 String handle = driver.getWindowHandle(); // 獲取所有頁面的句柄,並循環判斷不是當前的句柄 然后切換到子窗體 for (String handles : driver.getWindowHandles()) { if (handles.equals(handle)) continue; driver.switchTo().window(handles); } // 由於登錄輸入框在frame中,還需要先切換進入frame,否則,也找不到輸入框的 driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='ptlogin_iframe']"))); // 調試過程中,如果提示找不到元素,不知道是否切換成功了,可以把當前handler的source打印出來看看 // System.out.println(driver.getPageSource()); driver.findElement(By.xpath("//*[@id='switcher_plogin']")).click(); driver.findElement(By.xpath("//*[@id='u']")).sendKeys("317409898"); driver.findElement(By.xpath("//*[@id='p']")).sendKeys("xxxxxxxxx"); driver.findElement(By.xpath("//*[@id='login_button']")).click(); //由於我的賬號沒綁定手機,點登錄后會有個提示,如果直接關閉,可能被判斷為還沒完成登錄,沒有會話,所以稍等片刻 Thread.sleep(2000); //關閉彈出的子窗體 driver.close(); //driver.navigate() 下有很多方法,比如后退,刷新等 Thread.sleep(2000); } }
注意:1.我這里只開了兩個窗口,如果是多個,而且需要在窗口間切換操作的,注意在一個窗口中完成操作后,確認是否切回到需要操作的窗口
2.頁面內部有frame的,除了切換到具體頁面外,還要切換到對應的frame中才行
3.關閉窗口時,也要確認操作的對象