前言
在自動化測試中,咱們常常會碰到編寫腳本過程當中操做某個元素的時候, 須要等待頁面加載完成後,才能對元素操做,不然會報錯,提示頁面元素不存在異常,咱們須要等待元素加載完成後,
才能繼續操做,而Selenium爲咱們提供了對應的等待方法,來判斷元素是否存在。javascript
下面將用一個例子,針對元素等待操做作逐一講解css
實際案例
場景:點擊【建立div】按鈕,3秒後,頁面會出現一個綠色的div塊,同時顯示文字「我是div,我出現了,哈哈!」,咱們須要代碼去判斷這個div是否存在, 而後高亮,並正常顯示文字。html
被測html代碼以下:java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>等待練習案例</title> </head> <style type="text/css"> #green_box { background-color: chartreuse; width: 400px; height: 200px; border: none; } </style> <script type="application/javascript"> function wait_show() { setTimeout("create_div()", 3000); } function create_div() { var divElement = document.createElement('div'); divElement.id = "green_box"; var pElement = document.createElement('p'); pElement.innerText = "我是div,我出現了,哈哈!"; document.body.appendChild(divElement); divElement.appendChild(pElement); } </script> <body> <button onclick="wait_show()">建立div</button> </body> </html>
一、強制等待
強制等待,就是硬等待,使用方法Thread.sleep(int sleeptime),使用該方法會讓當前執行進程暫停一段時間(你設定的暫停時間)。弊端就是,你不能肯定元素多久能加載徹底,若是兩秒元素加載出來了,你用了30秒,形成腳本執行時間上的浪費。web
具體示例代碼以下:chrome
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver; @BeforeClass public void beforeClass(){ System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); driver = new ChromeDriver(); } @Test public void testByThread() { //打開測試頁面 driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"); driver.manage().window().maximize(); driver.findElement(By.id("wait")).click(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //得到div塊級元素 WebElement element = driver.findElement(By.id("green_box")); //獲取該元素css樣式中background-color屬性值 String cssValue = element.getCssValue("background-color"); //輸出屬性值 System.out.println("cssValue: "+cssValue); } @AfterClass public void afterClass(){ driver.quit(); } }
二、頁面等待
有時候咱們打開一個網頁,網頁自己加載速度就比較慢,只能等網頁徹底加載完畢,才能執行操做,那麼就能夠用pageLoadTimeout(pageLoadTime,TimeUnit.SECONDS)這個方法,如在設定時間內,網頁尚未還沒徹底加載就會報錯,剩下的時間將再也不等待。微信
具體示例代碼以下:app
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; public class TestWaitDemo { WebDriver driver; @BeforeClass public void beforeClass(){ System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); driver = new ChromeDriver(); } @Test public void testByPageLoad() { //打開測試頁面 driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"); //設置等待時間爲3秒,若是3秒頁面沒有所有加載出來,就會報錯,若是小於3秒就所有加載出來了,剩下的時間將再也不等待,繼續下一步操做 driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); driver.manage().window().maximize(); } @AfterClass public void afterClass(){ driver.quit(); } }
三、隱式等待
WebDriver 提供了三種隱性等待方法:異步
implicitlyWait
識別對象時的超時時間。過了這個時間若是對象還沒找到的話就會拋出NoSuchElement 異常。ide
setScriptTimeout
異步腳本的超時時間。WebDriver 能夠異步執行腳本,這個是設置異步執行腳本,腳本返回結果的超時時間。
pageLoadTimeout
頁面加載時的超時時間。由於 WebDriver 會等頁面加載完畢再進行後面的操做,因此若是頁面超過設置時間依然沒有加載完成,那麼 WebDriver 就會拋出異常。
隱式等待(implicit),方法implicitlyWait(long time, TimeUnit.SECONDS),即全局設置,對整個driver都有做用,如在設定時間內,特定元素沒有加載完成,則拋出異常,若是元素加載完成,剩下的時間將再也不等待。
具體示例代碼以下:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.util.concurrent.TimeUnit; public class TestWaitDemo { WebDriver driver; @BeforeClass public void beforeClass(){ System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); driver = new ChromeDriver(); } @Test public void testByImplicitlyWait() { //打開測試頁面 driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"); //設置等待時間爲3秒,若是3秒元素沒有加載出來,就會報錯,若是小於3秒元素加載出來了,剩下的時間將再也不等待,繼續下一步操做 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); driver.manage().window().maximize(); driver.findElement(By.id("wait")).click(); //得到div塊級元素 WebElement element = driver.findElement(By.id("green_box")); //獲取該元素css樣式中background-color屬性值 String cssValue = element.getCssValue("background-color"); //輸出屬性值 System.out.println("cssValue: "+cssValue); } @AfterClass public void afterClass(){ driver.quit(); } }
四、顯式等待
顯示等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件等到爲止,纔會繼續執行後續操做,等不到,就一直等,除非在規定的時間以內都沒找到,那麼就拋出異常了
方法一:
具體代碼以下:
package com.brower.demo; 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.ExpectedCondition; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver; @BeforeClass public void beforeClass() { System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); driver = new ChromeDriver(); } @Test public void testByShowWaiting() { //打開測試頁面 driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"); driver.manage().window().maximize(); driver.findElement(By.id("wait")).click(); /** *等待時間爲3秒,WebDriverWait默認每500ms就調用一次ExpectedCondition直到定位到div,若是3秒內div顯示出來,則繼續下一步, * 若是超過3秒沒有顯示出來,那麼則until()會拋出org.openqa.selenium.TimeoutExceptionn異常 */ WebDriverWait wait = new WebDriverWait(driver, 3); //元素是否存在,若是超過設置時間檢測不到則拋出異常。 wait.until(new ExpectedCondition<WebElement>() { @Override public WebElement apply(WebDriver driver) { //重寫方法 return driver.findElement(By.id("green_box")); } }); //得到div塊級元素 WebElement element = driver.findElement(By.id("green_box")); //獲取該元素css樣式中background-color屬性值 String cssValue = element.getCssValue("background-color"); //輸出屬性值 System.out.println("cssValue: " + cssValue); } @AfterClass public void afterClass() { driver.quit(); } }
方法二
示例代碼以下:
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.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class TestWaitDemo { WebDriver driver; @BeforeClass public void beforeClass() { System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe"); driver = new ChromeDriver(); } @Test public void testByShowWaiting() { //打開測試頁面 driver.get("file:///C:/Users/Administrator/Desktop/waitDemo.html"); driver.manage().window().maximize(); driver.findElement(By.id("wait")).click(); /** *等待時間爲3秒,WebDriverWait默認每500ms就調用一次ExpectedCondition直到定位到div,若是3秒內div顯示出來,則繼續下一步, * 若是超過3秒沒有顯示出來,那麼則until()會拋出org.openqa.selenium.TimeoutExceptionn異常 */ WebDriverWait wait = new WebDriverWait(driver, 3); wait.until(ExpectedConditions.presenceOfElementLocated(By.id("green_box"))); //得到div塊級元素 WebElement element = driver.findElement(By.id("green_box")); //獲取該元素css樣式中background-color屬性值 String cssValue = element.getCssValue("background-color"); //輸出屬性值 System.out.println("cssValue: " + cssValue); } @AfterClass public void afterClass() { driver.quit(); } }
顯式等待使用ExpectedConditions類中自帶方法, 能夠進行顯式等待的判斷,經常使用的判斷條件以下表:
等待的條件方法名稱 描述
elementToBeClickable(By locator) 頁面元素是否在頁面上可用和可被單擊
elementToBeSelected(WebElement element) 頁面元素處於被選中狀態
presenceOfElementLocated(By locator) 頁面元素在頁面中存在
textToBePresentInElement(By locator) 在頁面元素中是否包含特定的文本
textToBePresentInElementValue(By locator, java.lang.String text) 頁面元素值
titleContains(java.lang.String title) 標題 (title)
顯式等待常跟如下三種方法一塊兒使用,用來判斷元素
EOF
本文做者:久曲建的測試窩
本文連接:https://www.cnblogs.com/longronglang/p/11261340.html
關於博主:評論和私信會在第一時間回覆。或者直接私信我。
版權聲明:本博客全部文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
聲援博主:若是您以爲文章對您有幫助,能夠點擊文章右下角【推薦】一下。您的鼓勵是博主的最大動力!
優秀不夠,你是否無可替代
軟件測試交流QQ羣:721256703,期待你的加入!!
歡迎關注個人微信公衆號:軟件測試君