前言
在熟悉了元素定位之後,我們接下來就要學習對定位到的元素進行操作這項內容了。我簡要做了個總結,如下圖:
基本操作
元素的基本操作有很多,常用的有三個:click(點擊)、clear(清空)、sendkeys(輸入內容)、submit(提交)。何爲基本操作,即這些方法在WebElement
接口類中定義,通過實例化的WebElement
直接調用。
void click()
:單擊目標元素。void submit()
:提交當前form
(表單)內容到遠程服務器,注意是特定於表單元素而言的。void sendKeys(CharSequence... keysToSend)
:使用此方法模擬鍵入元素,這可能會設置元素的值。一般是對文本輸入元素進行此操作,否則會報錯org.openqa.selenium.ElementNotInteractableException: element not interactable
void clear()
:如果此元素是文本輸入元素(INPUT
型元素和TEXTAREA
元素),則將清除該值。對其他元素沒有影響。此方法並不會觸發鼠標和鍵盤操作。String getTagName()
:獲取並返回此元素的tagName
(String
類型)。String getAttribute(String name)
:獲取並返回當前元素的給定屬性的值(String
類型)。boolean isSelected()
:確定是否選擇了此元素。此操作僅適用於輸入元素,如checkboxes
(複選框)、options in a select
(下拉選擇框中的選項) 和radio buttons
(單選框按鈕)boolean isEnabled()
:元素當前是否已啓用?除了禁用的輸入元素之外的內容,通常都會返回true
。String getText()
:獲取此元素及子元素的可見(即不被CSS隱藏)內文本,不帶任何前導或尾隨空格。boolean isDisplayed()
:是否顯示此元素?Point getLocation()
:獲取並返回此元素的左上角在頁面上的位置(以一組x,y
軸座標值表示)。Dimension getSize()
:獲取並返回此元素的高度和寬度(一對整型像素值,如332,450)Rectangle getRect()
:呈現元素的位置和大小。String getCssValue(String propertyName)
:獲取並返回此元素給定CSS
屬性的值(String
類型)
select操作
select
,即下拉選擇框,這類元素的操作一般是選中select
中的某一項,selenium
中的Select
類提供了很多對select
元素的操作方法。
首先,從Select
類的有參構造函數可以看出,在初始化一個select
時,需要WebElement
作爲入參。接下來,我們看看,Select
類提供了哪些函數吧。
首先,我們最關心的當然是,下拉選擇的相關方法,其中單選3個方法:
void selectByVisibleText(String text)
:使用可見文本來選中某一項void selectByIndex(int index)
:使用索引來選中某一項void selectByValue(String value)
:使用value
來選中某一項
相對應的,多選也有4個方法(當然多選需要select
標籤的multiple
屬性的值爲multiple
):
void deselectAll()
:選中所有項void deSelectByVisibleText(String text)
:使用可見文本來選中某一項。void deSelectByIndex(int index)
:使用索引來選中某一項。void deSelectByValue(String value)
:使用value
來選中某一項。
另外,還提供一些其他方法:
boolean isMultiple()
:此select
元素的multiple
屬性的值是否爲multiple
?List<WebElement> getOptions()
:返回此select
元素所有的項。List<WebElement> getAllSelectedOptions()
:返回此select
元素所有選中狀態的項的集合。WebElement getFirstSelectedOption()
:返回此select
元素第一個選中狀態的項。setSelected(WebElement option, boolean select)
:使得此select
元素的某項被點擊(從而被選中),這個方法是下拉選擇的相關方法的核心實現方法。
下面用一個實例演示一下select
的操作。
示例代碼-select-1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
<select id="city" multiple="multiple">
<option value="">請選擇一個城市</option>
<option value="010" selected>北京</option>
<option value="021">上海</option>
<option value="0571">杭州</option>
</select>
</div>
</body>
</html>
實現代碼-select-1:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
/**
* @author muguozheng
* @date 2020/4/18 17:56
* @Description: 元素定位測試
* @modify
*/
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面-路徑改成自己的
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 獲取select元素
WebElement element = driver.findElement(By.cssSelector("#city"));
// 實例化一個select
Select select = new Select(element);
select.selectByVisibleText("上海");
// 增加延時以便觀察
Thread.sleep(3000);
select.selectByIndex(3);
Thread.sleep(3000);
select.selectByValue("010");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
頁面跳轉
這裏的頁面跳轉是廣義上的,包括跳轉到window
(新頁面)、frame
、alert
彈窗等。在selenium中,是藉助switchTo()
函數完成的。我們查看源碼,發現switchTo()
函數的返回值是TargetLocator
,這是接口類WebDriver
的一個內部接口,這個內部接口定義一系列跳轉方法。
這些方法的返回值都是WebDriver
,我們可以理解爲driver的焦點發生了轉移。因此,有一點需要留意,既然焦點轉移到了新的頁面上,那麼想要定位原頁面的元素,就要跳轉回去。
frame跳轉
WebDriver frame(int index)
:根據索引獲取frame
WebDriver frame(String nameOrId)
:根據name或id獲取frame
WebDriver frame(WebElement frameElement)
:根據WebElement
(也就是可以用xpath、css等定位到frame
元素作爲參數)獲取frame
WebDriver parentFrame()
:轉移焦點到父級內容,如果當前內容是頂級內容,將不發生變化。
下面進行實例演示。
頁面代碼-frame-1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
<select id="city">
<option value="">請選擇一個城市</option>
<option value="010">北京</option>
<option value="021">上海</option>
<option value="0571">杭州</option>
</select>
</div>
<iframe style="height:1000px;width:100%" id="myIframe" src="http://www.baidu.com"></iframe>
</body>
</html>
實現代碼-frame-1:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 跳轉到frame
// driver.switchTo().frame("myIframe") 通過nameOrId跳轉
// frame(WebElement frameElement)方式跳轉
driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='myIframe']")));
// 在frame中進一步操作
driver.findElement(By.id("kw")).sendKeys("測試");
Thread.sleep(3000);
// 跳轉回父級頁面
driver.switchTo().parentFrame();
Select select = new Select(driver.findElement(By.id("city")));
select.selectByValue("010");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
窗口跳轉
當我們點擊了a
標籤元素時,會觸發打開鏈接頁面的事件,有兩種情形:
- 在當前窗口加載新頁面內容
- 新建一個窗口加載新頁面內容,這種情況在
a
標籤有target="_blank"
時觸發
當發生第2種情況時,同上文的frame
類似,由於driver的焦點還停留在原窗口,我們在新窗口的頁面上定位元素時,自然會產生錯誤,因此引出driver
焦點跳轉問題。
selenium
提供了唯一的窗口跳轉方法:WebDriver window(String nameOrHandle)
,方法的入參nameOrHandle
意爲窗口名稱(name
)或句柄(handle
),但查看源碼和很多資料也沒弄清楚窗口的name
是什麼,只好先研究一下handle
了。
通過handle跳轉窗口有3種思路:
- 先記錄當前窗口句柄記爲句柄1(
String getWindowHandle()
),打開新頁面後獲取所有窗口句柄的集合,遍歷此集合,與句柄1不同則跳轉該句柄所指向的窗口。 - 打開新的頁面後獲取當前所有窗口句柄(
Set<String> getWindowHandles()
),通過索引(越晚打開的窗口,其索引越大)來跳轉到目標窗口。 - 打開新的頁面後獲取當前所有窗口句柄,通過窗口標題(
title
)來跳轉到目標窗口。
下面通過一個例子來進行演示,我們要實現的場景是:
- 打開【UI自動化測試頁面】,點擊超鏈接,在新窗口打開【UI自動化-新頁面】。
- 在【UI自動化-新頁面】的輸入框輸入"新頁面"。
- 返回【UI自動化測試頁面】,在輸入框輸入【原頁面】。
頁面代碼-window-1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UI自動化測試頁面</title>
</head>
<body>
<div id="div">
<a id="new_page" target="_blank" href="file:///E:/project/58coin/automation/src/test/java/testNew.html">點擊跳轉新頁面</a>
</div>
<div style="margin-top: 10px">
<input type="text" id="input">
</div>
</body>
</html>
頁面代碼-window-2:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UI自動化-新頁面</title>
</head>
<body>
<div>
<input type="text" id="new_input">
</div>
</body>
</html>
實現代碼-window-1(句柄對比方式):
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 獲取當前窗口句柄
String handlePresent = driver.getWindowHandle();
// 點擊超鏈接打開新頁面
driver.findElement(By.id("new_page")).click();
// 遍歷句柄集合,與handlePresent不同,則是新窗口,跳轉並結束遍歷
Set<String> handles = driver.getWindowHandles();
for (String handle : handles) {
if (!handle.equals(handlePresent)) {
driver.switchTo().window(handle);
break;
}
}
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
Thread.sleep(1000); // 暫停1s以便觀察
// 跳轉到原來窗口
driver.switchTo().window(handlePresent);
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.id("input")).sendKeys("原頁面");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
實現代碼-window-2(索引方式):
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 點擊超鏈接打開新頁面
driver.findElement(By.id("new_page")).click();
Set<String> winSet = driver.getWindowHandles();//獲取所有句柄
List<String> winList = new ArrayList<String>(winSet);//轉成list列表
// 跳轉到最新打開的窗口
driver.switchTo().window(winList.get(winList.size() - 1));
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
Thread.sleep(1000); // 暫停1s以便觀察
// 跳轉到倒數第二個打開的窗口
driver.switchTo().window(winList.get(winList.size() - 2));
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.id("input")).sendKeys("原頁面");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
實現代碼-window-3(標題方式):
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 點擊超鏈接打開新頁面
driver.findElement(By.id("new_page")).click();
// 獲取窗口句柄的集合(set)
Set<String> handles = driver.getWindowHandles();
// 遍歷並通過title判斷目標窗口
for (String handle : handles) {
if (driver.switchTo().window(handle).getTitle().contains("UI自動化-新頁面")) {
driver.switchTo().window(handle);
break;
}
}
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.cssSelector("#new_input")).sendKeys("新頁面");
Thread.sleep(1000); // 暫停1s以便觀察
// 遍歷並通過title判斷目標窗口
for (String handle : handles) {
if (driver.switchTo().window(handle).getTitle().contains("UI自動化測試頁面")) {
driver.switchTo().window(handle);
break;
}
}
System.out.println("當前頁面title:" + driver.getTitle());
driver.findElement(By.id("input")).sendKeys("原頁面");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
alert跳轉
alert彈窗本質是js原生代碼,不是標籤元素,並且一個頁面中最多有且僅有一個alert彈窗,如果頁面中出現了alert彈窗,一定要先處理它,不然無法進行其他操作。alert彈窗切換的操作非常簡單。
Alert接口中提供了以下幾個方法:
void dismiss()
:點擊彈窗的取消按鈕void accept()
:點擊彈窗的確認按鈕String getText()
:獲取彈窗的文本內容void sendKeys(String keysToSend)
:向彈窗中輸入內容
下面演示一個示例:
頁面代碼-alert-1:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UI自動化測試頁面</title>
<script type="text/javascript">
function display_alert() {
alert("I am an alert box!!")
}
</script>
</head>
<body>
<div>
<input type="button" id="alert" onclick="display_alert()" value="Display alert box"/>
<input type="text" id="input">
</div>
</body>
</html>
實現代碼-alert-1:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("file:///E:/project/automation/src/test/java/test.html");
// 點擊彈窗按鈕
driver.findElement(By.id("alert")).click();
// 彈窗確定:沒有這一步處理,後續操作將報錯
driver.switchTo().alert().accept();
// 輸入框輸入內容
driver.findElement(By.id("input")).sendKeys("測試");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
鼠標操作
在selenium中,所有的鼠標操作的實現全部由Actions
類提供。首先,Actions類提供了多個有參構造方法:
public Actions(WebDriver driver)
public Actions(Keyboard keyboard, Mouse mouse)
public Actions(Keyboard keyboard)
但後兩個構造方法只是擴展方法,很少用。第一個構造方法纔是最重要的,它的入參是當前的WebDriver
。
再讓我們看一下這個類提供了哪些操作鼠標的方法:
Actions clickAndHold(WebElement target)
:在特定元素上單擊鼠標左鍵(不釋放)Actions release(WebElement target)
:在特定元素上釋放鼠標左鍵Actions doubleClick(WebElement target)
:在特定元素上雙擊鼠標左鍵Actions moveToElement(WebElement target)
:移動鼠標指針到特定元素Actions contextClick(WebElement target)
:在特定元素上右鍵單擊Actions dragAndDrop(WebElement source, WebElement target)
:拖拽元素void perform()
:執行具體的操作。前面6個方法都是聲明一個操作,只有調用perform()
後纔會真正執行操作。
下面以拖拽元素做一下鼠標操作的演示:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("https://www.runoob.com/try/try-cdnjs.php?filename=jqueryui-api-droppable");
// 跳轉到右側iframe
driver.switchTo().frame("iframeResult");
WebElement source = driver.findElement(By.id("draggable"));
WebElement target = driver.findElement(By.id("droppable"));
Actions actions = new Actions(driver);
actions.dragAndDropBy(source, 110, 120).perform();
Thread.sleep(2000); // 延時以觀察效果
actions.dragAndDrop(source, target).perform();
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
鍵盤操作
對於鍵盤的模擬操作,Actions
類中有提供 keyUp(CharSequence key)
、keyDown(CharSequence key)
、sendKeys(CharSequence key)
等方法來實現。
另外在Keys類中,提供了很多模擬按鍵,如BACK_SPACE
、ENTER
等。
對於普通鍵盤,使用 sendKeys(CharSequence key)
就可以實現:
Actions action = new Actions(driver);
action.sendKeys(Keys.BACK_SPACE);// 模擬按下並釋放 BACK_SPACE鍵
action.sendKeys(Keys.ENTER);// 模擬按下並釋放回車鍵
而對於修飾鍵,在 WebDriver 中需要用到 KeyDown(theKey)、keyUp(theKey) 方法來操作。
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL);// 按下 Ctrl 鍵
action.keyDown(Keys.SHIFT);// 按下 Shift 鍵
action.keyDown(Key.ALT);// 按下 Alt 鍵
action.keyUp(Keys.CONTROL);// 釋放 Ctrl 鍵
action.keyUp(Keys.SHIFT);// 釋放 Shift 鍵
action.keyUp(Keys.ALT);// 釋放 Alt 鍵
修飾鍵是鍵盤上的一個或者一組特別的鍵,包括Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)等,與一般按鍵同時使用的時候,用來臨時改變一般鍵盤的普通行爲。
我們發現, Actions
類和WebElement
類都有一個sendKeys(CharSequence key)
方法,這兩個方法對於一般的輸入操作基本上相同,不同點在於以下幾點:
Actions
中的sendKeys(CharSequence key)
對於修飾鍵 (Modifier Keys) 的調用並不會釋放,也就是說當調用actions.sendKeys(Keys.ALT)
、actions.sendKeys(Keys.CONTROL)
、action.sendKeys(Keys.SHIFT)
的時候,相當於調用 actions.keyDown(keysToSend),而如果在現實的應用中想要模擬按下並且釋放這些修飾鍵,應該再調用action.sendKeys(keys.NULL)
來完成這個動作。- 當
Actions
的sendKeys(keysToSend)
執行完之後,焦點就不在當前元素了。所以我們可以使用 sendKeys(Keys.TAB) 來切換元素的焦點,從而達到選擇元素的作用,這個最常用到的場景就是在用戶名和密碼的輸入過程中。
下面以一個百度搜索測試的例子來演示鍵盤操作:
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 訪問測試頁面
driver.get("http://www.baidu.com");
WebElement input = driver.findElement(By.id("kw"));
input.sendKeys("測試試");
// 按下退格鍵刪除最後一個字
input.sendKeys(Keys.BACK_SPACE);
Thread.sleep(1000);
Actions actions = new Actions(driver);
// 按下回車鍵
actions.sendKeys(Keys.ENTER).perform();
Thread.sleep(15000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}
元素等待
在UI自動化執行過程中,如果頁面或元素沒有加載完成,就進行下一步操作,無疑是會拋出異常的,因此selenium
提供了多種元素等待的方法。
隱式等待
隱式等待是一種全局設置,在driver的整個生命週期都有效,設置方式如下:
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
按源碼解釋,驅動程序會輪詢頁面,直到找到該元素(找到後立即執行下一步)或超時(拋出org.openqa.selenium.NoSuchElementException
)。這種設置應該謹慎,充分考慮Xpath
等方式定位元素較慢的可能性。
顯式等待
顯示等待相對於隱式等待更加靈活,能針對各個元素進行單獨的設置。只有滿足顯式等待的條件滿足,測試代碼纔會繼續向後執行後續的測試邏輯,如果超過設定的最大顯式等待時間閾值, 這測試程序會拋出異常。
等待方法由ExpectedConditions
類提供,常用的有以下幾個(E代表ExpectedCondition):
E<Boolean> titleIs(final String title)
:判斷標題是否是給定標題。E<Boolean> titleContains(final String title)
:判斷標題是否包含給定標題。E<WebElement> presenceOfElementLocated(final By locator)
:判斷頁面元素在頁面中存在。E<Boolean> textToBePresentInElement(final WebElement element, final String text)
:給定元素中是否包含特定的文本。E<WebElement> elementToBeClickable(final By locator)
:判斷給定元素是否可點擊。E<Boolean> elementToBeSelected(WebElement element)
:判斷給定元素是否處於選中狀態。
還有非常多的其他判斷方法,可以根據場景靈活選用。下面以百度搜索爲例,演示顯示等待的使用:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class ElementTest {
public static void main(String[] args) {
// 指定瀏覽器驅動的路徑
String driverPath = "E:/source/driver/chromedriver_80_2.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
// 創建一個chrome driver
WebDriver driver = new ChromeDriver();
// 頁面最大化
driver.manage().window().maximize();
try {
// 設定顯示等待時間爲3s
WebDriverWait wait = new WebDriverWait(driver, 3);
// 訪問測試頁面
driver.get("http://www.baidu.com");
// 設置By.id("abc")這個元素加載完成才進行下一步,最多等待3s,否則拋出異常
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("abc")));
driver.findElement(By.id("kw")).sendKeys("測試");
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
} finally {
driver.quit();
}
}
}