框架搭建
基於maven+jdk8+junit5+seleium 構建
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.6.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-java-commons</artifactId>
<version>2.13.5</version>
<scope>compile</scope>
</dependency>
</dependencies>
驅動下載
下載地址 :http://chromedriver.storage.googleapis.com/index.html
測試demo
@Test
public void test1() throws IOException {
ChromeDriver driver = new ChromeDriver();
System. setProperty("webdriver.chrome.driver", "path");
//設定全屏
driver.manage().window().maximize();
driver.get("https://home.testing-studio.com/");
//d.findElement(By.cssSelector(". d-button-abl").cick();
driver.findElement(By.xpath("//span[contains(text(),'登入')]")).click();
snapshot((TakesScreenshot)driver, "截圖"+FakerUtils.getTimeStamp()+".jpg");
}
截圖方法:TakesScreenshot介面是依賴於具體的瀏覽器API操作的
// 截圖方法
public static void snapshot(TakesScreenshot drivername, String filename) {
String currentPath = System.getProperty("user.dir"); //get current work folder
System.out.println(currentPath);
File scrFile = drivername.getScreenshotAs(OutputType.FILE);
try {
System.out.println("save snapshot path is:"+currentPath+"/"+filename);
FileUtils.copyFile(scrFile, new File(currentPath+"\\"+filename));
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Can't save screenshot");
e.printStackTrace();
} finally {
System.out.println("screen shot finished");
}
}
執行
用列錄製
使用seleniumIDE 錄製
- 新建一個錄製project
輸入網站開始錄製,並在錄製的網頁上執行搜尋
當Test越來越多時,可以將多個Test歸類到Suites中,Suites就像小櫃子
建立專案時,IDE會建立一個預設Suite,並將第一個Test新增到其中,你可以點選Test,在下拉選單中選中Test suites進入Suites管理介面
首先進入Suites管理介面,點選`+`,提供名稱,然後單擊add:
將滑鼠懸停在`suite1`上,點選三個點彈出Suites管理選單:
可以對`suite1`進行管理,包括新增test,重新命名,刪除,設定,匯出
用例的編寫
public class testCase {
public static WebDriver driver;
@BeforeAll
static void initData(){
//載入驅動
driver=new ChromeDriver();
// 設定全域性隱式等待 5S
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
@Test
void Login(){
//讀取測試連結
driver.get("https://home.testing-studio.com/");
//獲取登入按鈕
driver.findElement(By.xpath("//span[contains(text(),'登入')]")).click();
driver.manage().window().maximize();
//清理記住的原賬號與密碼
driver.findElement(By.id("login-account-name")).clear();
driver.findElement(By.id("login-account-name")).sendKeys("*");
driver.findElement(By.id("login-account-password")).clear();
driver.findElement(By.id("login-account-password")).sendKeys("*");
driver.findElement(By.id("login-button")).click();
// 截圖
FakerUtils.snapshot((TakesScreenshot)driver,"截圖"+FakerUtils.getTimeStamp()+".jpg");
}
@AfterAll
static void tearDown(){
driver.quit();
}
}
執行分析:
Driver的初始化,每個測試用例執行都可以通過這個一個方法獲得一個driver.get()開啟一個網址
find_element(By.定位符,")
一個頁面還沒有完全載入完全,點選這個元素,發現這個元素是有問題的,元素找不到或者不可點選,等等,可以強行加sleep(不推薦)
每個元素定位的時候,都會去find_element查詢一個元素,在這個時候,通常我們需要引入一個新的機制,這個機制叫做隱式等待,解決元素找不到的問題,在規定的時間內,自動的去等待元素的出現,元素找到了,但是狀態不對,不可點選也會報錯
等待方式
隱式等待:
設定一個等待時間輪詢(預設0.5s)查詢 元素是否出現 (服務端)
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
顯式等待:
在客戶端本地每隔0.5s巡查下條件是否匹配 需要 例項化 webdriverwait
在程式碼中定義等待條件,當條件發生時才繼續執行程式碼`WebDriverWait`配合until()方法,根據判斷條件進行等待
程式每隔一段時間(預設為0.5秒)進行條件判斷,如果條件成立,則執行下一步,否則繼續等待,直到超過設定的最長時間
webDriverWait= new WebDriverWait(driver,100L);
強制等待
執行緒等待,執行緒休眠一段時間,Thread.sleep(2000)