Selenium入門(mén)
Selenium是一個(gè)用于Web應(yīng)用程序的自動(dòng)化測(cè)試工具。它直接運(yùn)行在瀏覽器中,可以模擬用戶(hù)在瀏覽器上面的行為操作。
chrome.exe
默認(rèn)安裝位置:C:\Program Files\Google\Chrome\Application\chrome.exe
結(jié)果我的在:C:\Users\91073\AppData\Local\Google\Chrome\Application\chrome.exe
。。。為啥?
下載驅(qū)動(dòng)
最新版:Chrome for Testing availability
查看谷歌瀏覽器版本
谷歌瀏覽器輸入網(wǎng)址的地方輸入:chrome://version
下載與瀏覽器對(duì)應(yīng)(或相近)版本的瀏覽器驅(qū)動(dòng):http://chromedriver.storage.googleapis.com/index.html
?備用地址:CNPM Binaries Mirror
解壓后得到一個(gè)chromedriver.exe驅(qū)動(dòng)文件
禁用自動(dòng)升級(jí)
關(guān)閉自動(dòng)升級(jí)方法:
1.右鍵單擊【計(jì)算機(jī)】——【管理】——【計(jì)算機(jī)管理本地】——【系統(tǒng)工具】——【任務(wù)計(jì)劃程序】——【任務(wù)計(jì)劃程序庫(kù)】——這里找到兩個(gè)和Google自動(dòng)更新相關(guān)的任務(wù)計(jì)劃【GoogleUpdateTaskMachineCore】與【GoogleUpdateTaskMachineUA】,把這兩個(gè)選項(xiàng)禁用。
2.在【服務(wù)和應(yīng)用程序】——【服務(wù)】,這里找到了兩個(gè)和Google更新相關(guān)的服務(wù)【Google更新服務(wù)(gupdate)】、【Google更新服務(wù)(gupdatem)】,右鍵——選擇屬性——啟動(dòng)類(lèi)型禁用即可;
卸載谷歌瀏覽器
在卸載當(dāng)前版本之前,建議備份你的書(shū)簽、擴(kuò)展、密碼等資料。
- 通過(guò)Windows?+?R快捷鍵調(diào)出“運(yùn)行”對(duì)話框。
- 鍵入APPWIZ.CPL和命中輸入。
這將帶您到所有已安裝應(yīng)用程序的列表。從列表中選擇Google Chrome,然后點(diǎn)擊卸載?命令。
降級(jí)版本
版本報(bào)錯(cuò)
Caused by: org.openqa.selenium.SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 114
Current browser version is 116.0.5845.97 with binary path C:\Users\91073\AppData\Local\Google\Chrome\Application\chrome.exe
Google瀏覽器歷史版本下載地址
Download older versions of Google Chrome for Windows, Linux and Mac
按住alt鍵,雙擊桌面的谷歌瀏覽器桌面圖標(biāo)
拷貝目標(biāo)路徑:C:\Users\lenovo\AppData\Local\Google\Chrome\Application\chrome.exe
打開(kāi)命令提示符,輸入如下并回車(chē)鍵;
cd?C:\Users\lenovo\AppData\Local\Google\Chrome\Application
輸入“chrome.exe--disable-remote-words-auto-upgrade--version=版本號(hào)”,然后按回車(chē)鍵。在這里,請(qǐng)將“版本號(hào)”替換為所需的版本號(hào)。
maven坐標(biāo)
打開(kāi)selenium的倉(cāng)庫(kù)地址 :https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
直接拷貝到pom文件吧,,
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.5</version>
</dependency>
<!-- 測(cè)試工具testng-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>test</scope>
</dependency>
入門(mén)案例
如果瀏覽器驅(qū)動(dòng)未加入環(huán)境變量,那么創(chuàng)建瀏覽器驅(qū)動(dòng)的時(shí)候,需要指定瀏覽器驅(qū)動(dòng)的路徑
public class Client {
public static void main(String[] args) throws InterruptedException {
//配置瀏覽器驅(qū)動(dòng)地址
System.setProperty("webdriver.chrome.driver", "D:\\tools\\chrome\\driver113\\chromedriver.exe");
//打開(kāi)Chrome瀏覽器
WebDriver webDriver = new ChromeDriver();
TimeUnit.SECONDS.sleep(5);
//打開(kāi)百度網(wǎng)站
webDriver.get("https://www.baidu.com");
TimeUnit.SECONDS.sleep(2);
//輸入框輸入搜索關(guān)鍵詞 selenium 中文官網(wǎng)
webDriver.findElement(By.id("kw")).sendKeys("selenium 中文官網(wǎng)");
TimeUnit.SECONDS.sleep(2);
//點(diǎn)擊百度一下按鈕
webDriver.findElement(By.id("su")).submit();
TimeUnit.SECONDS.sleep(2);
//查詢(xún)所有搜索的結(jié)果
List<WebElement> resultElements = webDriver.findElements(By.className("result"));
if (!resultElements.isEmpty()) {
//找到第一條結(jié)果的第一個(gè)鏈接
List<WebElement> aTagElements = resultElements.get(0).findElements(By.tagName("a"));
if (!aTagElements.isEmpty()) {
//新開(kāi)一個(gè)窗口打開(kāi)此鏈接
String href = aTagElements.get(0).getAttribute("href");
System.out.println(href);
((JavascriptExecutor) webDriver).executeScript(String.format("window.open('%s')", href));
}
}
TimeUnit.SECONDS.sleep(10);
//關(guān)閉瀏覽器
webDriver.quit();
}
}
結(jié)果,很神奇的哦
元素定位
web自動(dòng)化的難點(diǎn)和重點(diǎn)之一,就是如何?選擇
?我們想要操作的web頁(yè)面元素。
id定位
id 定位 driver.findElement(By.id(“id的值”));
如果元素有id屬性 ,這個(gè)id 必須是當(dāng)前html中唯一的。所以如果元素有id, 根據(jù)id選擇元素是最簡(jiǎn)單高效的方式。
- 使用WebDriver對(duì)象的findElement函數(shù)定義一個(gè)Web頁(yè)面元素
- 使用findElements函數(shù)可以定位頁(yè)面的多個(gè)元素
使用?
find_elements
?選擇的是符合條件的?所有
?元素, 如果沒(méi)有符合條件的元素,?返回空列表
List<WebElement> listOfElements = driver.findElements(By.xpath("http://div")); webElement.findElements(By.tagName("tr"));
- 如果沒(méi)有匹配條件的元素,F(xiàn)ind Elements命令將返回一個(gè)空列表
使用?
find_element
?選擇的是符合條件的?第一個(gè)
?元素, 如果沒(méi)有符合條件的元素,?拋出 NoSuchElementException 異常
定位的頁(yè)面元素需要使用WebElement對(duì)象來(lái)存儲(chǔ),以便后續(xù)使用
class定位
class 定位 ? ?driver.findElement(By.className(“class屬性”));
//企查查
webDriver.get("https://www.qcc.com/");
TimeUnit.SECONDS.sleep(2);
//查企業(yè) 查老板 查風(fēng)險(xiǎn) 查招標(biāo) 找關(guān)系
List<WebElement> elements = webDriver.findElements(By.className("search-type"));
class 屬性通常用于指向樣式表的類(lèi)
在html中,class規(guī)定元素的類(lèi)名,語(yǔ)法格式為“<元素名稱(chēng) class="value">”。class屬性大多數(shù)時(shí)候用于指向樣式表中的類(lèi)(class)。
html標(biāo)簽是允許定義多個(gè)class類(lèi)名的。比如:
<div class = "exp1 exp2"></div>
上邊這個(gè)div就用到了exp1、exp2這兩個(gè)class類(lèi),對(duì)于個(gè)數(shù)是沒(méi)有限制,只需每個(gè)類(lèi)名之間用空格隔開(kāi)就好。
xpath定位
xpath 是XML Path的簡(jiǎn)稱(chēng), 用于在XML文檔中選擇文檔中的節(jié)點(diǎn)?;赬ML樹(shù)狀文檔結(jié)構(gòu),Xpath語(yǔ)言可以在整棵樹(shù)中尋找指定的節(jié)點(diǎn)。
xpath 方式定位 driver.findElement(By.xpath(“xpath表達(dá)式”));
xpath 有兩種表示方法,絕對(duì)路徑和相對(duì)路徑,
絕對(duì)路徑是指從根開(kāi)始,以/開(kāi)始,如/html/body/div,
相對(duì)路徑是指在一個(gè)路徑下,另外的路徑以這個(gè)路徑作為參照,以//開(kāi)始。XPath表達(dá)式中的//表示在HTML文檔的全部層級(jí)位置進(jìn)行查找
舉例如下:
//百度一下
webDriver.get("https://www.baidu.com");
WebElement element = webDriver.findElement(By.xpath("http://*[@id='su']"));
那么為啥是//*[@] 呢?
- //表示從任意位置去查找
- *是標(biāo)簽名
- @是屬性定位
強(qiáng)烈建議使用相對(duì)路徑和屬性值結(jié)合的定位方式來(lái)編寫(xiě)xpath定位表達(dá)式。如
By.xpath("http://*[@id='su']")
xpath獲取技巧:
網(wǎng)頁(yè)的html是一種特殊的XML文檔。使用瀏覽器調(diào)試工具,可以直接獲取xpath語(yǔ)句
右鍵-檢查(或者F12),然后點(diǎn)擊這個(gè)箭頭,就可以在瀏覽器上選擇元素了
使用Chrome 來(lái)直接獲取元素的XPath.
通過(guò)層級(jí)關(guān)系和索引定位(索引從1開(kāi)始):
//*[@id="content"]/div/div[2]/div[4]/div[2]/h2/div[2]/form/div
tag 名 定位
TagName 標(biāo)簽名稱(chēng)定位 driver.findElement(By.tagName(“標(biāo)簽名稱(chēng)”));
選擇所有的tag名為 div的元素,如下所示
name定位
name定位 driver.findElement(By.name(“name的值”));
css定位
CSS定位為的優(yōu)勢(shì)在于定位速度比Xpath定位快,且比Xpath定位更加穩(wěn)定
css 方式定位 driver.findElement(By.cssSelector(“css表達(dá)式”));
操控元素
選擇到元素之后,我們的代碼會(huì)返回元素對(duì)應(yīng)的 WebElement對(duì)象,通過(guò)這個(gè)對(duì)象,我們就可以?操控
?元素
輸入框?send_keys
操控元素:send_keys在元素中輸入字符串,通常是對(duì)輸入框這樣的元素
//訪問(wèn)京東
webDriver.navigate().to("https://www.jd.com/");
WebElement input = webDriver.findElement(By.id("key"));
//清空輸入框 //*[@id="key"]
input.clear();
//在輸入框中輸入內(nèi)容
input.sendKeys("藍(lán)牙耳機(jī)");
對(duì)于input輸入框的元素,要獲取里面的輸入文本
// 找到元素
WebElement element = driver.findElement(By.id("usernameid"));
element.getAttribute("value");
按鈕 click
操控元素:click點(diǎn)擊元素
//單擊搜索按鈕
WebElement search = webDriver.findElement(By.xpath("http://*[@id='search']/div/div[2]/button"
search.click();
效果就是模擬人:打開(kāi)京東---輸入“藍(lán)牙耳機(jī)”--點(diǎn)擊搜索
//訪問(wèn)京東 webDriver.navigate().to("https://www.jd.com/"); WebElement input = webDriver.findElement(By.id("key")); //清空輸入框 //*[@id="key"] input.clear(); //在輸入框中輸入內(nèi)容 input.sendKeys("藍(lán)牙耳機(jī)"); //單擊搜索按鈕 WebElement search = webDriver.findElement(By.xpath("http://*[@id='search']/div/div[2]/button")); search.click();
下拉選擇框
獲取元素包含的信息,比如文本內(nèi)容,元素的屬性
在下拉列表中選擇值?
- selectByValue 語(yǔ)法
- selectByVisibleText 語(yǔ)法
- select.selectByIndex()語(yǔ)法;
如下圖,選擇“10進(jìn)制”轉(zhuǎn)"16進(jìn)制"
webDriver.get("https://tool.ip138.com/hexconvert/"); //選擇10進(jìn)制 WebElement webElementFrom = webDriver.findElement(By.xpath("http://*[@id=\"from_type\"]")); Select fromDropList = new Select(webElementFrom); fromDropList.selectByVisibleText("10進(jìn)制"); //選擇16進(jìn)制 WebElement webElementTo = webDriver.findElement(By.xpath("http://*[@id=\"to_type\"]")); Select toDropList = new Select(webElementTo); toDropList.selectByVisibleText("16進(jìn)制"); //打印下拉框中所有的選項(xiàng) List<WebElement> options = toDropList.getOptions(); for (WebElement option : options) { System.out.println(option.getText()); }
操作復(fù)選框
如下圖,我們勾選全局搜索和忽略大小寫(xiě)
操作單選框
如下圖,我們操作使得打開(kāi)網(wǎng)站后,選擇時(shí)間戳為“13位”,因?yàn)槟J(rèn)選中的是10位
webDriver.get("https://m.bejson.com/convert/unix/");
//13位時(shí)間戳(毫秒級(jí))
WebElement radio = webDriver.findElement(By.xpath("http://*[@id=\"kt_post\"]/div/div/div/div/div/form/div[2]/div[1]/div[2]/input"));
//如果處于未選中狀態(tài),則單擊選中
if (!radio.isSelected()) {
radio.click();
}
鏈接 link
鏈接的操作
// 找到鏈接元素
WebElement link1 = driver.findElement(By.linkText("小坦克"));
WebElement link11 = driver.findElement(By.partialLinkText("坦克"));
// 點(diǎn)擊鏈接
link1.click();
表格操作
尋找一個(gè)在線的被測(cè)試的網(wǎng)頁(yè)表格,假設(shè)如下:
Personal pronouns table (mdn.github.io)
th和td的區(qū)別
<tr>...</tr> 定義一行標(biāo)簽,一組行標(biāo)簽內(nèi)可以建立多組由<td>或<th>標(biāo)簽所定義的單元格
<th>...</th> 定義表頭單元格。表格中的文字將以粗體顯示
<td>...</td> 定義單元格標(biāo)簽,一組<td>標(biāo)簽將將建立一個(gè)單元格
//創(chuàng)建瀏覽器實(shí)例
WebDriver driver = new ChromeDriver();//打開(kāi)chrome
driver.get("https://mdn.github.io/learning-area/html/tables/basic/personal-pronouns.html");//打開(kāi)一個(gè)在線的網(wǎng)頁(yè)表格
//獲取頁(yè)面表格對(duì)象
WebElement element = driver.findElement(By.xpath("/html/body/table"));
//獲取表格行數(shù)
List<WebElement> tr = element.findElements(By.tagName("tr"));
System.out.println("表格行數(shù):" + tr.size());
Action
使用 Action 類(lèi)來(lái)生成用戶(hù)事件,例如右鍵單擊 WebDriver 中的元素。參考代碼片段:
Actions action = newActions(driver);
WebElement element = driver.findElement(By.id("elementId"));
//右鍵單擊元素
action.contextClick(element).perform();
//鼠標(biāo)懸停
action.moveToElement(element).perform();
拖放
Actions builder = newActions(driver);
Action dragAndDrop = builder.clickAndHold(fromWebElement)
.moveToElement(toWebElement)
.release(toWebElement)
.build();
dragAndDrop.perform();
Web 元素可見(jiàn)性
WebDriver 允許用戶(hù)檢查 Web 元素的可見(jiàn)性。這些網(wǎng)絡(luò)元素可以是按鈕、單選按鈕、下拉菜單、復(fù)選框、框、標(biāo)簽等,它們與以下方法一起使用。
- isDisplayed()
- isSelected()
- isEnabled()
窗口
?網(wǎng)頁(yè)訪問(wèn)
方式一:get方法
//訪問(wèn)京東
webDriver.get("https://www.jd.com/");
方式二:
//訪問(wèn)京東
webDriver.navigate().to("https://www.jd.com/");
一些別的頁(yè)面操作
1、頁(yè)面最大化
//將瀏覽器窗口最大化 webDriver.manage().window().maximize(); //訪問(wèn)京東 webDriver.navigate().to("https://www.jd.com/");
2、獲取頁(yè)面Title屬性
//獲取頁(yè)面Title屬性 String title = webDriver.getTitle(); System.out.println(title);
3、獲取頁(yè)面的源代碼
//訪問(wèn)京東 webDriver.navigate().to("https://www.jd.com/"); //獲取網(wǎng)頁(yè)的源代碼 String pageSource = webDriver.getPageSource(); System.out.println(pageSource);
4、刷新頁(yè)面
driver.navigate().refresh();
窗口切換
//獲取當(dāng)前所有打開(kāi)的瀏覽器窗口的句柄
Set<String> windowHandles = webDriver.getWindowHandles();
for (String windowHandle : windowHandles) {
System.out.println(windowHandle);
System.out.println(webDriver.switchTo().window(windowHandle).getTitle());
}
//獲取當(dāng)前瀏覽器窗口的句柄
String windowHandle = webDriver.getWindowHandle();
System.out.println("當(dāng)前窗口句柄:"+windowHandle);System.out.println("當(dāng)前窗口句柄:"+windowHandle);
控制臺(tái)打印輸出如下
窗口關(guān)閉
webDriver.close()
如果打開(kāi)了多個(gè)頁(yè)面是關(guān)不干凈的,close()只關(guān)閉當(dāng)前的一個(gè)頁(yè)面。
使用時(shí)要注意 “當(dāng)前頁(yè)面” 這四個(gè)字,意味著當(dāng)你關(guān)閉新打開(kāi)的頁(yè)面時(shí),需要切換窗口才能操作新窗口并將它關(guān)閉。
webDriver.quit()
quit()是退出了所有Webdriver所有的窗口,并退出驅(qū)動(dòng)程序。
Frame
iframe標(biāo)簽
HTML 內(nèi)聯(lián)框架元素 (<iframe>
)?表示嵌套的browsing context。它能夠?qū)⒘硪粋€(gè) HTML 頁(yè)面嵌入到當(dāng)前HTML頁(yè)面中。
在 HTML 文檔中 <frame> 每出現(xiàn)一次,就會(huì)創(chuàng)建一個(gè) Frame對(duì)象
通常我們使用iframe直接直接在頁(yè)面嵌套iframe標(biāo)簽指定src就可以了。
<iframe src="demo_iframe.html"></iframe>
可以通過(guò)iframe嵌套通用的頁(yè)面, 提高代碼的重用率, 比如頁(yè)面的頭部樣式和底部版權(quán)信息
Frame切換
在使用selenium打開(kāi)一個(gè)網(wǎng)頁(yè)時(shí),我們的操作范圍默認(rèn)是當(dāng)前的 html ,并不包含被嵌入的html文檔里面的內(nèi)容。如果我們要操作被嵌入的 html 文檔 中的元素, 就必須把操作范圍切換到被嵌入的文檔中。
?WebDriver對(duì)象的switch_to屬性轉(zhuǎn)換,形如
//其中switchFlag可以是frame元素的name或者 ID屬性及 frame 所對(duì)應(yīng)的 WebElement 對(duì)象。
driver.switchTo().frame(switchFlag);
例如frame元素的?id?為‘frame1’,切換語(yǔ)句為:driver.switch_to.frame('frame1')
例如frame元素的name屬性值為‘innerFrame’ ,切換語(yǔ)句為:driver.switch_to.frame('innerFrame')
為什么要切換frame表單
參數(shù)可以是id,name或者能定位到frame的元素。推薦使用name
在切換其他frame頁(yè)面之前,需要將WebDriver 對(duì)象切換回默認(rèn)區(qū)域:
webDriver.switchTo().defaultContent();
frame切換/窗口切換 | 白月黑羽 (byhy.net)
安居客登錄
登錄 (anjuke.com)
如下,紅色區(qū)域部分是一個(gè)<iframe>標(biāo)簽
彈窗
1、alert彈框
警告消息框 alert 方法有一個(gè)參數(shù),即希望對(duì)用戶(hù)顯示的文本字符串。該字符串不是 HTML 格式。該消息框提供了一個(gè)“確定”按鈕讓用戶(hù)關(guān)閉該消息框,并且該消息框是模式對(duì)話框,也就是說(shuō),用戶(hù)必須先關(guān)閉該消息框然后才能繼續(xù)進(jìn)行操作。
selenium處理alert() 提示框:
- driver.switchTo().alert(); 獲取alert
- alert.accept(); 點(diǎn)確定
- alert.dismiss(); 點(diǎn)取消
- alert.getText();獲取alert的內(nèi)容
2、confirm彈框
確認(rèn)消息框 使用確認(rèn)消息框可向用戶(hù)問(wèn)一個(gè)“是-或-否”問(wèn)題,并且用戶(hù)可以選擇單擊“確定”按鈕或者單擊“取消”按鈕。confirm 方法的返回值為 true 或 false。該消息框也是模式對(duì)話框:用戶(hù)必須在響應(yīng)該對(duì)話框(單擊一個(gè)按鈕)將其關(guān)閉后,才能進(jìn)行下一步操作。
1
3、div彈窗
div彈窗是瀏覽器中比較好定位的彈窗,定位的方法與普通的元素一樣。不過(guò)這里會(huì)有一個(gè)坑,明明可以找到這個(gè)按鈕,但是就是定位不到。這個(gè)就是因?yàn)楫?dāng)前有div彈窗彈出的時(shí)候,需要設(shè)置一下等待時(shí)間,等頁(yè)面元素加載完畢,再去做其他操作。這里用百度登陸為例子:
執(zhí)行js
執(zhí)行js代碼
executeScript是同步方法,用它執(zhí)行js代碼會(huì)阻塞主線程執(zhí)行,直到j(luò)s代碼執(zhí)行完畢;
import org.openqa.selenium.JavascriptExecutor;
//第一行代碼將driver強(qiáng)制轉(zhuǎn)換為JavascriptExecutor
JavascriptExecutor js = (JavascriptExecutor) driver;
//第二行代碼是執(zhí)行js,參數(shù)script是要執(zhí)行的js語(yǔ)句,第二個(gè)參數(shù)對(duì)于executeScript這個(gè)方法,取決于js語(yǔ)句是否需要參數(shù)。
js.executeScript(String script, object... args);
executeScript方法返回值Boolean, Long, String, List or WebElement. 或者是 null.
- 如果返回一個(gè)頁(yè)面元素(document element), 這個(gè)方法就會(huì)返回一個(gè)WebElement
- 如果返回浮點(diǎn)數(shù)字,這個(gè)方法就返回一個(gè)double類(lèi)型的數(shù)字
- 返回非浮點(diǎn)數(shù)字,方法返回Long類(lèi)型數(shù)字
- 返回boolean類(lèi)型,方法返回Boolean類(lèi)型
- 如果返回一個(gè)數(shù)組,方法會(huì)返回一個(gè)List
- 其他情況,返回一個(gè)字符串
- 如果沒(méi)有返回值,此方法就會(huì)返回null
應(yīng)用舉例:用js彈出alert
JavascriptExecutor js = (JavascriptExecutor) webDriver;
js.executeScript("alert('Test Case Execution Is started Now..')");
webDriver.switchTo().alert().accept();
隱式等待
強(qiáng)制等待:sleep
sleep,設(shè)置等待多長(zhǎng)時(shí)間,就要等待多長(zhǎng)時(shí)間。等待完成后,才會(huì)繼續(xù)下一步:
//設(shè)置等待時(shí)間,單位是秒 sleep(3)
由于web加載的速度取決于測(cè)試的硬件、網(wǎng)速、服務(wù)器的響應(yīng)時(shí)間等因素。如果時(shí)間設(shè)置太長(zhǎng),容易造成時(shí)間浪費(fèi),如果設(shè)置太短又可能會(huì)造成在web還沒(méi)有加載完所需要定位的element,而出現(xiàn)報(bào)錯(cuò)。由于等待時(shí)間無(wú)法確定,使用太多的sleep會(huì)影響運(yùn)行速度,大大地降低效率。
隱式等待:implicitlyWait
使用implicitlyWait方法設(shè)定查找頁(yè)面元素的最大等待時(shí)間,調(diào)用findElement方法時(shí)
沒(méi)有立刻找到定位元素,則程序會(huì)每間隔一段時(shí)間就嘗試判斷頁(yè)面的D0M中是否出現(xiàn)被查找元素,若超過(guò)設(shè)定的等待時(shí)長(zhǎng)依舊沒(méi)有找到,則拋出NoSuchElementException//只需要設(shè)置一次,所有的元素都可有最多 10s 的等待加載的時(shí)間 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); WebElement element = driver.findElement(By.id("exampleId"));
隱式等待的默認(rèn)最長(zhǎng)等待時(shí)間是0,一旦設(shè)置完成,這個(gè)隱式等待會(huì)在webdriver對(duì)象實(shí)例的整個(gè)生命周期起作用
---------------
隱式等待原理:
在每次進(jìn)行 find_element時(shí)起作用,implicitlyWait()會(huì)將一個(gè)超時(shí)的時(shí)間閥值傳遞給 WebDriver,在findelement或者findelements的時(shí)候,首先去找 web element,如果沒(méi)有找到,判斷時(shí)間否超超過(guò) implicitlyWait()傳遞進(jìn)來(lái)的閥值,如果沒(méi)有超過(guò),則再次找這個(gè)element,直到找到 element 或者時(shí)間超過(guò)最大閥值。
顯式等待
顯式等待:WebDriverWait類(lèi)
WebDriverWait(driver,10,1) 在等待期間,每隔1s一定時(shí)間,調(diào)用until或until_not里的方法,直到它返回True或False.
- driver:瀏覽器驅(qū)動(dòng)。
- 10:最長(zhǎng)超時(shí)時(shí)間,默認(rèn)以秒為單位。
- 1:檢測(cè)的的間隔(步長(zhǎng)) 時(shí)間,默認(rèn)為 0.5s。
顯式等待能自定義等待條件,只要滿足等待條件即可執(zhí)行下一步代碼操作,一般需要配合該類(lèi)的until()和until_not()方法一起用.
表示程序每隔一定時(shí)間就檢查一遍條件是否成立,如果成立了就執(zhí)行下一步,否則就繼續(xù)等。直到超過(guò)設(shè)置的最長(zhǎng)時(shí)間,然后拋出超時(shí)錯(cuò)誤TimeoutException
//判斷某元素是否可訪問(wèn)并且可啟用,比如能夠點(diǎn)擊 new WebDriverWait(driver, 10) .until(ExpectedConditions.elementToBeClickable(webElement)); //判斷某個(gè)元素是否可見(jiàn). 可見(jiàn)代表元素非隱藏,并且元素的寬和高都不等于0 new WebDriverWait(driver, 10) .until(ExpectedConditions.visibilityOf(webElement)); //判斷某元素否被選中 new WebDriverWait(driver, 10) .until(ExpectedConditions.elementToBeSelected(webElement));
常用的顯示等待條件如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764320.html
自定義顯示等待
注意ExpectedConditions的寫(xiě)法變成了自定義文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764320.html
WebDriverWait wait = new WebDriverWait(driver, Manager_Config.getCmdTimeout() / 1000);
try {
Alert alert = wait.until(new ExpectedCondition<Alert>() {
@Override
public Alert apply(WebDriver driver) {
try {
return driver.switchTo().alert();
} catch (NoAlertPresentException e) {
return null;
}
}
});
if (alert != null)
alert.accept();
到了這里,關(guān)于selenium瀏覽器自動(dòng)化測(cè)試【基于java】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!