打開瀏覽器
Ø 打開firefox瀏覽器
WebDriver driver =newFirefoxDriver();
Ø 打開IE瀏覽器(需要IEDriverServer.exe支持)
WebDriver driver =newInternetExplorerDriver ();
Ø 打開HtmlUnit瀏覽器
WebDriver driver = newHtmlUnitDriver();
Ø 打開chrome瀏覽器(需要chromedriver.exe)
WebDriver
driver =new ChromeDriver();
最大化瀏覽器
Ø firefox,IE瀏覽器:
driver.manage().window().maximize();
Ø 打開chrome瀏覽器:(上面的方法資料顯示可以最大化chrome瀏覽器,不過測試後發現不成功,原因未知,故用下面的方法)
ChromeOptionsoptions = new ChromeOptions();
options.addArguments("user-data-dir=" +userProfile,"--disable-prerender-local-predictor","--incognito","--start- maximized");
driver =newChromeDriver(options);
關閉瀏覽器
Ø driver.close(); //關閉當前窗口
Ø driver.quit(); //關閉所有打開的窗口
有時候我們需要關閉主頁意外的所有窗口,這個時候就需要做邏輯判斷,靈活使用close這個方法了
publicvoid closeOtherWindows() {
for(String windows : driver.getWindowHandles())
if(!windows.equals(main_window)) {
driver.switchTo().window(windows);
driver.close();
}
driver.switchTo().window(main_window);
}
main_window是主頁的窗口句柄,在打開
driver.get("http://www.baidu.com");
driver.navigate().to("http://www.baidu.com/");
navigate方法會產生1個Navigator對象,navigate同時支持頁面前進、後退、刷新
driver.navigate().forward
driver.navigate().back
driver.navigate().refresh
獲取頁面的標題
driver.getTitle();
Cookie
Ø 刪除cookie
driver.manage().deleteAllCookies();
Ø 增加cookie
driver.manage().addCookie(<Cookie>);
Ø 獲取所有cookie
Set<Cookie> cookiesSet = driver.manage().getCookies();
for (Cookie c : cookiesSet) {
String cookies+= c.getName() + "=" + c.getValue() + ";";
}
Ø 獲取所有指定cookie
Set<Cookie> cookiesSet = driver.manage().getCookies();
for (Cookie c : cookiesSet) {
if (c.getName().equals(cookieName)){
Stringcookies += c.getName() + "=" + c.getValue() + ";";
}
}
頁面元素定位
Webdriver提供下面兩種方法來定位頁面元素,參數是By對像,最常用是id和name查找。
Ø findElement 定位某個元素,WebElement類型
Ø findElements 定位一組元素,List<WebElement>類型
支持的元素定位方法有:
By.id:driver.findElement(By.id("id));
By.name:driver.findElement(By.name("name"));
By.xpath:driver.findElement(By.xpath("//input[@id='id']"));
By.className:driver.findElement(By.className("input_class"));
By.cssSelector:driver.findElement(By.cssSelector(".input_class"));
By.linkText:driver.findElement(By.linkText("link"));
By.partialLinkText:driver.findElement(By.partialLinkText("link"));
By.tagName:driver.findElement(By.tagName("form"));
實際上常用的只有id,name,xpath,css,這四個足夠定位到所有元素,而name據說以後將會廢棄掉。
判斷元素是否顯示
element.isDisplay();
獲取元素屬性
element.getAttribute(<attribute>); //得到元素的屬性值
輸入框
element.sendKeys(“test”);//在輸入框中輸入內容:
element.clear(); //將輸入框清空
element.getText(); //獲取輸入框的文本內容:
下拉選擇框
select.selectByVisibleText(“A”);
select.selectByValue(“1”);
select.deselectAll();
select.deselectByValue(“1”);
select.deselectByVisibleText(“A”);
select.getAllSelectedOptions();
select.getFirstSelectedOption();
單選框
radio.click(); //選擇某個單選項
radio.clear(); //清空某個單選項
radio.isSelected(); //判斷某個單選項是否已經被選擇
多選框
checkbox.click();
checkbox.clear();
checkbox.isSelected(); //判斷多選框是否被選擇
checkbox.isEnabled(); //判斷多選框是否可用
按鈕
btn.click(); //點擊按鈕
btn.isEnabled (); //判斷按鈕是否可用
Alert對話框
alert.accept(); //點擊確定
alert.dismiss(); //點擊取消
alert.getText(); //獲取Alert對話框的文本
表單
approve.click();
approve.submit();//只適合於表單的提交
上傳文件
driver.sendKeys(filePath);
這個方法並不適用於所有上傳文件的步驟,有的需要藉助autoIt這個工具,試具體的Web項目而定。
Windows 和 Frames之間的切換
driver.switchTo().defaultContent(); //返回到最頂層的frame/iframe
driver.switchTo().frame("leftFrame"); //切換到某個frame:
driver.switchTo().window("windowName"); //切換到某個window
需要注意的是,當從一個Frame1切換到另一個Frame2的時候,不能直接調用切換driver.switchTo().frame("Frame2");這裏會出問題我們需要從Frame1返回到最頂層,再切換到Frame2,如:
driver.switchTo().frame("Frame1");
driver.switchTo().defaultContent();
driver.switchTo().frame("Frame2");
調用Java Script
JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript("JS腳本");
WebDriver是可以直接調用JS腳本來處理頁面的,改變頁面的樣式,比如需要把一個隱藏元素顯示出來,就需要藉助JS,WebDriver是無法直接操作隱藏元素的。本人對JS也不是太熟悉,只用到最常用的幾個方法,這裏就不詳細介紹JS了。
給幾個常用的調用JS的例子出來:
Ø 滾動到指定元素
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView()", element);
Ø 滾動到指定高度
((JavascriptExecutor)driver).executeScript("document.documentElement.scrollTop=" + height);
Ø 滾動到頁面頂部
((JavascriptExecutor)driver).executeScript("var q=document.documentElement.scrollTop=0");
Ø 點擊隱藏元素
((JavascriptExecutor)driver).executeScript("arguments[0].click();",element);
超時設置
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS); //識別元素時的超時時間
driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS); //頁面加載時的超時時間
driver.manage().timeouts().setScriptTimeout(10,TimeUnit.SECONDS); //異步腳本的超時時間
頁面的加載跟客戶端的網絡環境,服務器的性能等相關,加速的速度會有不同,一個頁面也許幾秒就加載完成,有時候可能需要幾分鐘甚至更久,用上面的幾種方式勢必會因網絡問題使得我們不得不修改傳入的時間參數,這個時候我們就需要有一個智能的等待時間,比如某個元素出現以後,我們就判定頁面加載完成:
WebDriverWait driverWait =(WebDriverWait) new WebDriverWait(driver, 15, 500).ignoring(StaleElementReferenceException.class).withMessage("Timeout" +15);
try {
driverWait.until(newExpectedCondition<Boolean>() {
public Booleanapply(WebDriver driver) {
return (element.isDisplay());
}
});} catch(TimeoutException e) {
throw new WebDriverException("Nonew window prompted out.");
}
Actions action = new Actions(driver);
action.sendKeys(<Keys>).perform();
鍵盤上的每一個按鍵都有對應的Keys
截屏
File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
部分移動端API
driver .launchApp(); //打開App
driver.closeApp(); //關閉App
driver.installApp (AppPath); //安裝App
driver.removeApp(); //卸載App
driver.tap(1, element, pressTime); //單擊指定元素
driver.tap(1, x,y, pressTime); //單擊指定座標
androidDriver.swipe(startX, startY, endX, endY, duration); //滑動屏幕
driver.setNetworkConnection(new NetworkConnectionSetting(false,true, true)); //連接wifi
driver.setNetworkConnection(new NetworkConnectionSetting(false,false, true));//斷開wifi
driver.setNetworkConnection(new NetworkConnectionSetting(true,false,false)); //開啓飛行模式