硒等待:内隐,外显,流利和睡眠
Selenium等待頁面加載在Selenium腳本中起著重要的作用。 它們有助于使它們不易剝落,更可靠。 Selenium提供多次等待,以根據某些條件在腳本執行中提供足夠的等待或暫停。 從而確保您在使用Selenium執行自動化測試時不會導致腳本失敗。 在本教程中,我們將解釋Selenium等待和睡眠的類型,并提供實時示例以及對它們的比較研究。 讓我們首先回答一個關鍵問題:“為什么要使用硒等待?”
為什么我們需要硒等待?
大多數現代應用程序的前端都是基于JavaScript或Ajax構建的,使用諸如React,Angular之類的框架,或任何其他需要花費一定時間才能在頁面上加載或刷新Web元素的框架。 因此,如果您傾向于在腳本中找到尚未加載到頁面上的元素,則selenium會向您拋出“ ElementNotVisibleException ”消息。
下面的代碼段將幫助您展示與使用Selenium執行自動化測試時相同的問題。 在此代碼段中,我使用的是easymytrip.com的示例,在該示例中,post用戶選擇行程日期的“ From”和“ To”目的地,Web應用程序需要花費一些時間來加載所需的航班詳細信息。 在這種情況下,用戶無需等待就可以從列表中預訂第一個航班。 現在,由于頁面尚未加載,腳本無法找到“立即預訂”按鈕。 結果拋出“ NoSuchElementException ”。 下面的代碼段和控制臺輸出:
import java.util.concurrent.TimeUnit; ? import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; ? import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor; ? public class NoWaitImplemented { ?public static void main(String[] args) throws InterruptedException { ????????System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); ????????WebDriver driver= new ChromeDriver(); ????????driver.manage().window().maximize(); ????????????????driver.get( " https://www.easemytrip.com/ " ); ????????driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click(); driver.findElement(By.xpath( "//button[text()='Book Now']" )).click(); ?????????????????????????????} ? } 控制臺輸出:
我已經使用XPath通過腳本對Selenium進行自動化測試來定位Web元素。
:帶有示例的在硒中使用XPath的完整指南
Selenium等待頁面加載有助于解決此問題。 Selenium等待有不同類型,例如隱式等待和顯式等待,可確保在Selenium腳本發現元素之前,將元素加載到頁面中以進行進一步的操作。
硒類型等待頁面加載
在使用Selenium執行自動化測試時,在生成Selenium腳本時,我們使用以下類型的等待:
- Thread.Sleep()方法
- 隱式等待
- 顯式等待
- 流利的等待
讓我們深入了解其中的每一個。
Thread.Sleep()用于使用硒進行自動化測試
Sleep是屬于線程類的靜態方法。 可以使用類名(即Thread)的引用來調用此方法。 如果在使用Selenium執行自動化測試時使用Thread.sleep ,則此方法將在指定的持續時間內停止執行腳本,而不管是否在網頁上找到了該元素。 它接受持續時間(以毫秒為單位)。 相同的語法是:
Thread.sleep(3000);
睡眠函數拋出InterruptedException,因此應使用try-catch塊進行處理,如下所示:
try { Thread.sleep( 5000 ); } catch (InterruptedException ie){ }為什么使用Thread.Sleep()不是一個好主意?
現在,我將重點介紹使用thread.sleep()的一些缺點。
- Selenium Webdriver等待指定的時間,無論是否找到元素。 如果在指定的持續時間之前找到元素,腳本將仍然等待該持續時間,從而增加了腳本的執行時間。
- 如果要顯示的元素在靜態時間后沒有出現并保持更改,那么您將永遠不會知道睡眠功能所需的估計時間。 如果花費的時間超過了定義的時間,腳本將拋出錯誤。 這就是為什么,如果您正在使用Selenium等待處理動態元素,那么最好不要使用Thread.sleep()。
- Thread.sleep僅適用于之前編寫的元素。 如果您有兩到四個元素需要等待一定的時間才能加載,則在這種情況下,需要多次指定Thread.sleep。 如果這樣做的話! 好的,您到處都會發現腳本充滿了Thread.sleep()語法。
由于上述缺點,在腳本創建中使用Thread.Sleep()被認為是一種不好的做法。
下面的代碼片段突出顯示了Thread.Sleep()在Selenium自動化測試中的用法。 在此示例中,我們使用與上面的easymytrip相同的示例,在該示例中,一旦用戶單擊搜索,我們將停止線程執行。 在這種情況下,代碼可以正常工作,而不會引發任何錯誤。
import java.util.concurrent.TimeUnit; ? import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; ? import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor; ? public class ThreadWait { ?public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub ????????//setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); ????????//Initiating your chromedriver WebDriver driver= new ChromeDriver(); ????????driver.manage().window().maximize(); ????????????????driver.get( " https://www.easemytrip.com/ " ); ????????driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click(); Thread.sleep( 5000 ); driver.findElement(By.xpath( "//button[text()='Book Now']" )).click(); ?????????????????????????????????} ? }現在,如果我有同一應用程序的另一個頁面需要花費一些時間來加載,該怎么辦? 在這種情況下,我不想在腳本中多次使用thread.sleep()。
您可能會認為,如果不是Thread.sleep(),那么哪個Selenium等待頁面加載就足以滿足測試要求?
在這種情況下,這就是隱式等待的地方。 讓我們詳細檢查隱式硒。
硒隱式等待自動化測試
Selenium解決了Thread.sleep()提供的問題,并提出了兩個Selenium等待頁面加載的方法。 其中之一是隱式等待,它允許您將WebDriver暫停特定的時間,直到WebDriver在網頁上找到所需的元素為止。
這里要注意的關鍵點是,與Thread.sleep()不同,它不等待整個時間段。 如果在指定的持續時間之前找到了元素,它將繼續執行代碼的下一行,從而減少了腳本執行的時間。 這就是為什么隱式等待也稱為動態等待的原因。 如果未在指定的持續時間內找到該元素,則拋出ElementNotVisibleException 。
關于隱式等待的另一件值得注意的事情是,它是全局應用的,這使其比Thread.sleep()更好。 這意味著您只需編寫一次即可,它適用于整個WebDriver實例中腳本上指定的所有Web元素。 方便嗎? 實現相同的語法是:
driver.manage().timeouts().implicitlyWait(Time Interval to wait for , TimeUnit.SECONDS);隱式等待的默認時間為零,并且每隔500毫秒會不斷輪詢所需的元素。 讓我們看下面的代碼片段,展示隱式等待的用法。 在此示例中,我使用相同的easymytrip示例。 在這種情況下,我們將向前邁進并繼續進行預訂過程,在此過程中頁面需要花費更多的時間來加載。 這里有兩個頁面存在頁面加載問題,我們正在使用隱式等待而不是多次使用Thread.sleep()來處理一行代碼。
import java.util.concurrent.TimeUnit; ? import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; 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.support.ui.Select; ? import com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor; ? public class ImplicitWait { ?public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub ????????//setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); ????????//Initiating your chromedriver WebDriver driver= new ChromeDriver(); ????????driver.manage().window().maximize(); ????????driver.manage().timeouts().implicitlyWait( 30 , TimeUnit.SECONDS); driver.get( " https://www.easemytrip.com/ " ); ????????driver.findElement(By.id( "FromSector_show" )).sendKeys( "Delhi" , Keys.ENTER); driver.findElement(By.id( "Editbox13_show" )).sendKeys( "Mumbai" , Keys.ENTER); driver.findElement(By.id( "ddate" )).click(); driver.findElement(By.id( "snd_4_08/08/2019" )).click(); driver.findElement(By.className( "src_btn" )).click(); ?driver.findElement(By.xpath( "//button[text()='Book Now']" )).click(); ????????JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript( "window.scrollBy(0,750)" ); ????????driver.findElement(By.xpath( "//input[@type='email']" )).sendKeys( "sadhvisingh9049@gmail.com" ); ????????driver.findElement(By.xpath( "//span[text()='Continue Booking']" )).click(); ????????WebElement title=driver.findElement(By.id( "titleAdult0" )); ????????Select titleTraveller= new Select(title); ????????titleTraveller.selectByVisibleText( "MS" ); driver.findElement(By.xpath( "//input[@placeholder='Enter First Name']" )).sendKeys( "Sadhvi" ); driver.findElement(By.xpath( "//input[@placeholder='Enter Last Name']" )).sendKeys( "Singh" ); ????????driver.findElement(By.xpath( "//input[@placeholder='Mobile Number']" )).sendKeys( "9958468819" ); ????????driver.findElement(By.xpath( "//div[@class='con1']/span[@class='co1']" )).click(); ?????????} ? }現在,我們知道了一個事實,即應該在一定的持續時間內加載頁面,但是如果我們不知道該元素在加載時是可見/可點擊的,該怎么辦。 正如它出現的時候一樣,它是動態的,并且會不斷變化。 在這種情況下,顯式等待將幫助您克服此問題。 讓我們研究它的細節。
明確等待使用Selenium進行自動化測試
顯式等待是動態Selenium等待的另一種。 顯式等待幫助可在特定時間段內根據特定條件停止腳本的執行。 時間到頭后,您將獲得ElementNotVisibleException 。 在您不知道要等待的時間的情況下,此顯式等待會派上用場。 使用elementToBeClickable()或textToBePresentInElement()之類的條件 ,可以等待指定的持續時間。 可以結合使用WebDriverWait和ExpectedConditions類來使用這些預定義的方法。 為了使用這種情況,請在您的課程中導入以下軟件包:
import org.openqa.selenium.support.ui.ExpectedConditions import org.openqa.selenium.support.ui.WebDriverWait發布該代碼后,需要為WebDriverWait類創建一個引用變量,并使用WebDriver實例實例化該變量,并提供可能需要的Selenium等待頁面加載的數量。 時間單位是秒。 可以如下定義它:
WebDriverWait wait = new WebDriverWait(driver, 30 );為了使用ExpectedCondition類的預定義方法,我們將使用如下的wait引用變量:
wait.until(ExpectedConditions.visibilityOfElementLocated(Reference of Element to be located using locator));預期條件的類型:
以下是在使用Selenium執行自動化測試時通常使用的幾種預期條件。
- visibleOfElementLocated()-驗證給定元素是否存在
- alertIsPresent()-驗證是否存在警報。
- elementToBeClickable()-驗證給定元素是否在屏幕上存在/可單擊
- textToBePresentInElement()-驗證給定元素是否具有必需的文本
- titlels()-驗證條件,等待具有給定標題的頁面
還有更多可用的預期條件,您可以通過Selenium官方GitHub頁面進行引用。 像隱式等待一樣,顯式等待也會在每500毫秒后繼續輪詢。
以下是突出顯示顯式Selenium等待的用法的代碼段。 在此示例中,我們使用的是“ rentomojo”應用程序,其中的模式在動態時間顯示在主頁上。 使用顯式等待,基于元素的可見性,我們將等待元素并關閉彈出窗口。 參考代碼:
import java.util.concurrent.TimeUnit; ? import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; 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 ExplicitWait { ?public static void main(String[] args) { // TODO Auto-generated method stub ????????//setting the driver executable System.setProperty( "webdriver.chrome.driver" , ".\\Driver\\chromedriver.exe" ); ????????????????//Initiating your chromedriver WebDriver driver= new ChromeDriver(); ????????????????????????????????????????????????driver.manage().window().maximize(); ????????????????driver.get( " https://www.rentomojo.com/ " ); ????????????????driver.findElement(By.xpath( "//span[@class='rm-city__selectorBoxLoca'][contains(text(),'Delhi')]" )).click(); ????????????????????????????????????????????????WebDriverWait wait= new WebDriverWait(driver, 120 ); ????????????????????????????????wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath( "//div[@class='Campaign__innerWrapper']/button" )))); driver.findElement(By.xpath( "//div[@class='Campaign__innerWrapper']/button" )).click(); ?} ? }注意-當同時使用隱式等待和顯式等待時,它們將在累積時間上工作,而不是在單個等待條件下工作。 例如,如果給定隱式等待30秒,給定顯式等待10秒,那么它正在尋找的顯式元素將等待40秒。
硒等待之間的區別:顯式與隱式
現在,由于您已經知道隱式等待和顯式等待的用法,因此讓我們研究一下這兩個Selenium等待之間的區別:
| 默認情況下,它將應用于腳本中的所有元素。 | 它僅適用于特定條件的特定元素。 |
| 我們不能根據指定條件(例如元素選擇/可點擊)而不是顯式地等待。 | 明確地說,我們可以根據特定條件指定等待時間。 |
| 當您確定該元素在特定時間內可能可見時,通常使用它 | 當您不知道元素可見性的時間時,通常使用它。 它具有動態性質。 |
Fluent等待使用Selenium進行自動化測試
就其功能而言,Fluent等待類似于顯式等待。 在Fluent等待中,當您不知道某個元素可見或單擊所需的時間時,將對它執行Selenium等待。 Fluent等待提供的一些差異因素是:
- 輪詢頻率-在顯式等待的情況下,默認情況下此輪詢頻率為500毫秒。 使用Fluent wait,您可以根據需要更改此輪詢頻率,即,您可以告訴腳本在每個“ x”秒之后繼續檢查元素。
- 忽略異常-在輪詢期間,如果找不到元素,則可以忽略任何異常,例如'NoSuchElement'異常等。
除了這些差異因素(例如顯式等待或隱式等待)之外,您還可以定義等待元素可見或可操作的時間。 以下語法或代碼行用于定義Selenium中的Fluent等待:
默認情況下,它將應用于腳本中的所有元素。語法似乎很復雜,但是一旦開始使用,它可能會變得很方便。 可能這是測試人員選擇進行顯式等待而不是進行Fluent等待的最大原因之一。 另外,Explicit等待和Fluent等待之間的主要區別在于Explicit Selenium Wait提供了預定義的條件,這些條件適用于我們需要等待的元素,而對于Fluent Selenium等待,則可以定義自己的自定義條件適用方法中的條件。
我對Fluent Selenium Wait的看法?
我個人還沒有在實時示例中找到任何有用的流暢等待的實現,因此到目前為止,我希望自己不要執行它。 我和您一樣渴望推出Selenium 4 。 我希望在發布之后,我們可以對使用Fluent等待而不是其他Selenium等待的實際優勢有更多的了解。 到目前為止,根據我的經驗,由于它比Fluent Selenium wait更容易實現代碼,因此我傾向于使用Explicit Selenium wait。 如果您有其他意見,請在下面的評論中告訴我。
硒的角色等待基于云的硒網格
大多數測試人員通常更喜歡使用基于云的服務提供商進行Selenium測試的自動化網站測試 ,例如LambdaTest(云上的跨瀏覽器測試工具)。 想知道為什么嗎?
那么,如果您在基于云的Selenium網格(例如LambdaTest)上運行自動化腳本 ,會發生什么呢? 硒等待如何有助于有效的測試結果?
每個基于云的提供程序都會在拋出Selenium超時異常之前提供默認的時間限制。 這樣做是為了防止過度利用云資源。 在LamdaTest中,默認超時為90秒。 現在,如果您對Web元素的加載時間超過90秒,那該怎么辦?
這就是硒等待的地方。 如果您的測試套件很復雜,可能會在云Selenium Grid上面臨超時問題,那么您可以使用Selenium wait將WebDriver暫停默認時間超過90秒。 因此,避免在成功運行自動化腳本時發生超時錯誤。
硒的最終裁決正在等待中!
Selenium Waits可以幫助您減少腳本的脆弱性和可靠性。 無論選擇哪種等待方式,都要確保它能幫助您實現Selenium自動化測試背后的目標。 另一要注意的關鍵是要確保在應用程序中不保留不必要的Selenium等待。 Thread.sleep()過去可能是一個選項,但是現在我們有新的Selenium等待和即將來臨,我寧愿建議您遠離Thread.sleep()來推動Selenium自動化測試。 因此,下一次您遇到了元素或頁面加載問題時,便知道在哪里尋找。 測試愉快!
翻譯自: https://www.javacodegeeks.com/2019/08/selenium-waits-implicit-explicit-fluent-sleep.html
總結
以上是生活随笔為你收集整理的硒等待:内隐,外显,流利和睡眠的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 极狐考拉母婴亲子汽车上市,售 13.18
- 下一篇: 无影灯原理 无影灯是如何组成的