# [一](https://www.cnblogs.com/unknows/p/7688613.html)?**WebElement相關方法**
1.點擊操作
~~~
WebElement button = driver.findElement(By.id("login"));
button.click();
~~~
由元素對象調用click()方法;
2.清除操作
~~~
WebElement username = driver.findElement(By.id("username_input"));
username.clear();
~~~
調用之后,會把輸入框的內容全部清空;
3.獲得元素屬性的值
~~~
<input type="text" value="" autocomplete="off" placeholder="用戶名" id="u" class="form-control" onblur="checkFailNum()" name="username">
~~~
上面代碼是用戶名輸入框的源碼,我們要獲取這個"用戶名"三個字就需要用到;
getAttribute(java.lang.String name) 這方法,代碼如下:
~~~
WebElement username = driver.findElement(By.id("u"));
username.getAttribute("placeholder");
~~~
4.獲取元素的文本
~~~
<input type="text" value="" autocomplete="off" placeholder="用戶名" id="u" class="form-control" onblur="checkFailNum()" name="username">
~~~
~~~
WebElement login = driver.findElement(By.id("loginBtn"));
login.getText();
~~~
5.元素是否顯示
方法有個返回值類型是boolean,也就是說如果元素顯示了返回true,如果沒有顯示返回false;
~~~
WebElement login = driver.findElement(By.id("loginBtn"));
login.isDisplayed();
~~~
6.元素是否被選擇
~~~
WebElement checkbox = driver.findElement(By.id("checkbox_id"));
checkbox.isSelected();
checkbox.isSelected();//會有返回值,如果勾選了。返回true,如果沒有勾選返回false。
~~~
7.元素是否被啟用
~~~
WebElement login = driver.findElement(By.id("loginBtn"));
login.isEnabled();
//如果可用返回true,如果不可用返回false
~~~
8.提交操作
~~~
<button class="btn btn-major" id="loginBtn" type="submit">登錄</button>
~~~
~~~
WebElement login = driver.findElement(By.id("loginBtn"));
login.submit();
~~~
### iFrame處理
有時候我們在定位一個頁面元素的時候發現一直定位不了,反復檢查自己寫的定位器沒有任何問題,代碼也沒有任何問題。這時你就要看一下這個頁面元素是否在一個iframe中,這可能就是找不到的原因之一。如果你在一個default content中查找一個在iframe中的元素,那肯定是找不到的。反之你在一個iframe中查找另一個iframe元素或default content中的元素,那必然也定位不到。selenium webdriver中提供了進入一個iframe的方法:
~~~
WebDriver org.openqa.selenium.WebDriver.TargetLocator.frame(String nameOrId)
~~~
也提供了一個返回default content的方法:
~~~
WebDriver org.openqa.selenium.WebDriver.TargetLocator.defaultContent()
driver.switchTo().frame("id");//傳入的是iframe的id
~~~
返回上一個iFrame:
~~~
driver.switchTo().defualContent();
~~~
### select 操作下拉選擇框
html代碼:
~~~
<select style="width:75px" onchange="change_prodj()" name="province" id="province">
<option value="10">A 安徽</option>
<option value="11">A 澳門</option>
<option value="12">B 北京</option>
<option value="43">C 重慶</option>
<option value="13">F 福建</option>
<option value="14">G 甘肅</option>
<option value="15">G 廣東</option>
<option value="16">G 廣西</option>
<option value="17">G 貴州</option>
<option value="18">H 海南</option>
<option value="19">H 河北</option>
<option value="20">H 河南</option>
<option value="21">H 黑龍江</option>
</select>
~~~
首先定位到select下拉框
~~~
WebElement element_province = driver.findElement(By.id(“province”));
~~~
然后將定位到的element傳入select
~~~
Select province = new Select(element_province);
~~~
然后由select來操作下拉框
~~~
province.selectByIndex(0) //根據所選值的位置來選擇下拉框值,從0開始
province.selectByValue(“18”) //根據value值來選擇下拉框的值,比如這里的18,選擇的就是海南
province .selectByVisibleText(“北京”)//這個是根據可見文本來操作下拉菜單,比如你選的北京,那么就會找到北京作為下拉框的
~~~
### 處理alert 彈窗
獲取當前頁面彈出的alert
~~~
Alert a= driver.switchTo().alert();
~~~
~~~
alert.accept();
~~~
獲取到alert之后,我們可以通過alert提供的方法來獲取alert上的文本,模擬點擊alert上的確定按鈕,模擬點擊alert上的取消按鈕等

### 處理瀏覽器彈出的新窗口
我們在一個頁面上,點擊一個鏈接之后不會在當前頁面上打開此鏈接而是新開一個窗口打開此頁面。那么我們如何跳轉到新開的頁面去操作新開的頁面呢?selenium也提供了對應的API來處理。首先我們需要了解下,每個窗口都是有個句柄的,可以理解為瀏覽器窗口的標識符。我們可以根據這些標識符來確定新開的窗口,具體思路如下:
首先獲得當前句柄:
~~~
String current_handles = driver. getWindowHandle();
~~~
出現新窗口之后,獲取所有窗口句柄
~~~
Set<String> all_handles = driver.getWindowHandles();
~~~
循環判斷,把當前句柄從所有句柄中移除,剩下的就是你想要的新窗口
~~~
Iterator<String> it = all_handles.iterator();
while(it.hasNext()){
if(current_handles == it.next()) continue;
//跳入新窗口
WebDriver window = dr.switchTo().window(it.next());
}
~~~
最后就可以在新窗口的頁面進行相關操作了,在新窗口操作的時候使用新driver進行頁面操作,新driver是window
如果想回到最開始的窗口請使用:
~~~
driver.switchTo().window(current_handles);
~~~
### 執行JS腳本
有時候我們需要JS腳本來輔助我們進行測試,比如我們用JS賦值或者用js執行點擊操作等。
方法一:
聲明js腳本
String js =“alert(\\"hello,this is a alert!\\")”;
執行js腳本
((JavascriptExecutor) driver).executeScript(js);
執行之后會在瀏覽器上彈出一個alert,顯示內容是“hello,this is a alert!”
核心代碼如下:
~~~
WebDriver driver = new FirefoxDriver();
String js ="alert(\"hello,this is a alert!\")";
((JavascriptExecutor) driver).executeScript(js);
Thread.sleep(2000);
driver.quit();
~~~
方法二:
這個方法比較適用某些元素不易點擊的情況下使用,比如網頁內容太長,當前窗口太長,想要點擊那些不在當前窗口可以看到元素可以用此方法。
((JavascriptExecutor) driver).executeScript(String js, Object args);
此方法有兩個參數,第一個是js腳本,至于js腳本你像寫點擊的或者輸入的腳本都可以,我們這里舉例為點擊操作。第二個參數是:要點擊的元素。
比如我要點擊百度搜索的搜索按鈕,可以這樣寫:
((JavascriptExecutor) driver).executeScript(“arguments\[0\].click();”, driver.findElement(By.id(“su”)));
核心代碼如下:
~~~
WebDriver driver = new FirefoxDriver();
driver.get("https://www.baidu.com/");
String js ="arguments[0].click();";
driver.findElement(By.id("kw")).sendKeys("JAVA");
WebElement searchButton = driver.findElement(By.id("su"));
((JavascriptExecutor) driver).executeScript(js,searchButton);
Thread.sleep(2000);
driver.quit();
~~~
### 等待元素加載
1.硬性等待(不推薦)
~~~
Thread.sleep(int sleeptime);
~~~
2.智能等待
~~~
public void waitForElementToLoad(int timeOut, final By By) {
try {
(new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
WebElement element = driver.findElement(By);
return element.isDisplayed();
}
});
} catch (TimeoutException e) {
Assert.fail("超時!! " + timeOut + " 秒之后還沒找到元素 [" + By + "]",e);
}
}
~~~
3.設置等待頁面加載完畢
~~~
int pageLoadTime = 10;
driver.manage().timeouts().pageLoadTimeout(pageLoadTime, TimeUnit.SECONDS);
~~~
### **鼠標事件**
action類去操作鼠標
**Actions 類提供了鼠標操作的常用方法:**
· contextClick() ? ?右擊
· clickAndHold() ? 鼠標點擊并控制
· doubleClick() ? ?雙擊
· dragAndDrop() ? 拖動
· release() ? ? ? ?釋放鼠標
· perform() ?執行所有Actions中存儲的行為
**鼠標右擊操作。**
導入提供鼠標操作的ActionChains 類
Actions(driver)
調用Actions()類,將瀏覽器驅動driver作為參數傳入。
contexClick(xxx)
contextClick()方法用于模擬鼠標右鍵操作,在調用時需要指定元素定位。
perform()?執行所有ActionChains中存儲的行為,可以理解成是對整個操作的提交動作。
~~~
action.contextClick(driver.findElement(By.className("cnisdisd"))).perform();
~~~
**鼠標懸停。clickAndHold();**
~~~
action1.clickAndHold(driver.findElement(By.linkText("設置"))).perform();
~~~
**鼠標雙擊操作。**
doubleClick()方法用于模擬鼠標雙擊操作。
~~~
action1.doubleClick(driver.findElement(By.className(""))).perform();
~~~
**鼠標拖放操作。**
drag\_and\_drop(source, target)在源元素上按下鼠標左鍵,然后移動到目標元素上釋放。
·source:鼠標拖動的源元素。
·target:鼠標釋放的目標元素。
~~~
WebElement source=driver.findElement(By.className("element"));
WebElement target=driver.findElement(By.className("element"));
action1.dragAndDrop(source, target).perform();
~~~
**釋放鼠標**
release()方法用于釋放鼠標事件。
~~~
action1.release().perform();
~~~
### **?鍵盤事件**
~~~
使用鍵盤按鍵方法前需要先導入keys類。
以下為常用的鍵盤操作:
sendKeys(Keys.BACK_SPACE) ? ? 刪除鍵(BackSpace)
sendKeys(Keys.SPACE) ? ? ? ? ? ? ?空格鍵(Space)
sendKeys(Keys.TAB) ? ? ? ? ? ? ? ? ?制表鍵(Tab)
sendKeys(Keys.ESCAPE) ? ? ? ? ? ?回退鍵(Esc)
sendKeys(Keys.ENTER) ? ? ? ? ? ? ?回車鍵(Enter)
sendKeys(Keys.CONTROL,'a') ? 全選(Ctrl+A)
sendKeys(Keys.CONTROL,'c') ? 復制(Ctrl+C)
sendKeys(Keys.CONTROL,'x') ? 剪切(Ctrl+X)
sendKeys(Keys.CONTROL,'v') ? ?粘貼(Ctrl+V)
sendKeys(Keys.F1) ? ? ? ? ? ? ? ? ? ?鍵盤F1
……
sendKeys(Keys.F12) ? ? ? ? ? ? ? ? 鍵盤F12
eg:
package com.cy.selenium;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;?public class Test02 {
public static void main(String[] args) {
WebDriver driver=new FirefoxDriver();
driver.manage().window().maximize();
driver.get("http://www.baidu.com/");
WebElement input =driver.findElement(By.id("kw"));
// 輸入內容
input.sendKeys("seleniumm");
// 刪除多余的m
input.sendKeys(Keys.BACK_SPACE);
// 輸入空格+教程
input.sendKeys(Keys.SPACE);
input.sendKeys("教程");
// ctrl+a
input.sendKeys(Keys.CONTROL,"a");
// ctrl+x
input.sendKeys(Keys.CONTROL,"x");
// ctrl+v
input.sendKeys(Keys.CONTROL,"v");
// 通過回車鍵 查詢
input.sendKeys(Keys.ENTER);
driver.close();
}
}
~~~
### 設置瀏覽器窗口大小
窗口最大化
~~~
driver.manage().window().maximize();
~~~
指定設置窗口大小
~~~
Dimension d = new Dimension
driver.manage().window().setSize(d);
~~~
指定窗口在屏幕中出現位置
~~~
Point p = new Point(500, 300);
driver.manage().window().setPosition(p);
~~~
### 控制瀏覽器后退、前進
~~~
* back() 模擬瀏覽器后退按鈕
* forward() 模擬瀏覽器前進按鈕
*
driver.navigate().back();
~~~
### 刷新頁面
~~~
refresh() 刷新頁面(F5)
driver.navigate().refresh();
~~~
### 截圖
