java使用selenium自動化WebDriver等待的示例代碼
java使用selenium自動化WebDriver等待
顯式等待和隱式等待是WebDriver中兩種常用的等待方式,它們都可以用來等待特定的條件滿足后再繼續(xù)執(zhí)行代碼。
1.顯式等待(Explicit Wait):使用WebDriverWait類來實現(xiàn),可以根據(jù)特定條件等待元素出現(xiàn)、可見、可點擊等。
示例代碼:
WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("exampleId"))); // 等待元素出現(xiàn)并可見后,繼續(xù)執(zhí)行下一行代碼
通過 ExpectedConditions
類提供的方法,可以等待元素的可見性、可點擊性、存在等不同條件。
2.隱式等待(Implicit Wait):使用 driver.manage().timeouts().implicitlyWait()
方法來設(shè)置等待的超時時間,然后在查找元素時會等待指定的時間,如果在超時時間內(nèi)找到了元素,則繼續(xù)執(zhí)行下一行代碼,否則拋出 NoSuchElementException
異常。
示例代碼:
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); WebElement element = driver.findElement(By.id("exampleId")); // 等待10秒內(nèi)找到元素,如果超時未找到則拋出異常
隱式等待適用于整個WebDriver會話的生命周期,只需要設(shè)置一次,然后在之后的查找元素中會自動等待指定的時間。
補充:Selenium:三種等待方式
UI自動化測試,大多都是通過定位頁面元素來模擬實際的生產(chǎn)場景操作。但在編寫自動化測試腳本中,經(jīng)常出現(xiàn)元素定位不到的情況,究其原因,無非兩種情況:1、有frame;2、沒有設(shè)置等待。
因為代碼運行速度和瀏覽器加載渲染速度,不是一個量級,所以導(dǎo)致了這種情況發(fā)生。webdriver提供了3種類型的等待:顯式等待、隱式等待、強制等待。
一、顯示等待
定義:等待某個條件成立時繼續(xù)執(zhí)行,否則在達到最大時長時拋出異常(TimeoutException);
WebDriverWait類是由webdriver提供的等待方法,配合該類提供的until()和until_not()方法一起使用,就可以根據(jù)判斷條件而靈活進行等待,格式如下
- WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
- driver:瀏覽器驅(qū)動
- timeout:最長超時時間
- poll_frequency:檢測間隔時間,默認0.5s
- ignored_exceptions:超時后的異常信息,默認情況拋出NoSuchElementException異常
- WebDriverWait()一般由until()或until_not方法配合使用,下面是這兩種方法的說明:
- until(method,message=''):調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為True;
- until_not(method,message=''):調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為Flase;
示例代碼如下:
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe") driver.implicitly_wait(10) driver.get('http://www.cnblogs.com/imyalost/') locator = (By.LINK_TEXT, '老_張') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) print(driver.find_element_by_link_text('老_張').get_attribute('href')) finally: driver.close()
代碼解析:
本例中,通過as關(guān)鍵字將expected_conditions重命名為EC,并調(diào)用presence_of_element_located()方法判斷元素是否存在;
上面的例子中,同時使用了隱性等待和顯性等待,但是需要注意的是:等待的最長時間取兩者之中的最大值;
expected_conditions類提供的預(yù)期條件判斷方法如下:
- title_is: 判斷當前頁面的title是否完全等于(==)預(yù)期字符串,返回布爾值
- title_contains : 判斷當前頁面的title是否包含預(yù)期字符串,返回布爾值
- presence_of_element_located : 判斷某個元素是否被加到了dom樹里,并不代表該元素一定可見 4 visibility_of_element_located : 判斷某個元素是否可見. 可見代表元素非隱藏,并且元素的寬和高都不等于0
- visibility_of : 跟上面的方法做一樣的事情,只是上面的方法要傳入locator,這個方法直接傳定位到的element就好了 presence_of_all_elements_located : 判斷是否至少有1個元素存在于dom樹中。舉個例子,如果頁面上有n個元素的class都是‘column-md-3‘,那么只要有1個元素存在,這個方法就返回True
- text_to_be_present_in_element : 判斷某個元素中的text是否 包含 了預(yù)期的字符串
- text_to_be_present_in_element_value : 判斷某個元素中的value屬性是否 包含 了預(yù)期的字符串
- frame_to_be_available_and_switch_to_it : 判斷該frame是否可以switch進去,如果可以的話,返回True并且switch進去,否則返回False
- invisibility_of_element_located : 判斷某個元素中是否不存在于dom樹或不可見
- element_to_be_clickable : 判斷某個元素中是否可見并且是enable的,這樣的話才叫clickable
- staleness_of : 等某個元素從dom樹中移除,注意,這個方法也是返回True或False
- element_to_be_selected : 判斷某個元素是否被選中了,一般用在下拉列表
- element_selection_state_to_be : 判斷某個元素的選中狀態(tài)是否符合預(yù)期
- element_located_selection_state_to_be : 跟上面的方法作用一樣,只是上面的方法傳入定位到的element,而這個方法傳入locator
- alert_is_present : 判斷頁面上是否存在alert
二、隱式等待
定義:通過設(shè)定的時長等待頁面元素加載完成,再執(zhí)行下面的代碼,如果超過設(shè)定時間還未加載完成,則繼續(xù)執(zhí)行下面的代碼(注意:在設(shè)定時間內(nèi)加載完成則立即執(zhí)行下面的代碼);
隱式等待的方法為:implicitly_wait,示例代碼如下:
# coding = utf-8 from selenium import webdriver driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe") driver.implicitly_wait(10) # 隱性等待,最長等10秒 driver.get('http://www.cnblogs.com/imyalost/') print(driver.current_url) driver.quit()
代碼解析:
本例中,設(shè)置的等待時長為10秒,但這10秒并非一個固定時間,并不影響腳本執(zhí)行速度;其次,隱式等待對整個driver的周期都起作用,因此只需要設(shè)置一次即可。
三、強制等待
即sleep()方法,由python中的time模塊提供,強制讓代碼等待xxx時間,無論前面的代碼是否執(zhí)行完成或者還未完成,都必須等待設(shè)定的時間。
示例代碼如下:
# coding = utf-8 from selenium import webdriver from time import sleep driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe") driver.get('http://www.cnblogs.com/imyalost/') sleep(5) print(driver.current_url) driver.quit()
代碼解析:
本例中,設(shè)置強制等待時間為5秒,5秒之后,打印獲取到的當前頁面的url,然后關(guān)閉窗口。
這種強制等待的方法,在debug時候很有用,不過建議慎用這種方法,因為太死板,嚴重影響程序執(zhí)行速度!
以上三種等待方法,在具體的場景中需要根據(jù)情況選擇合適的方法,靈活運用。。。
到此這篇關(guān)于java使用selenium自動化WebDriver等待的文章就介紹到這了,更多相關(guān)java selenium自動化WebDriver等待內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java將集合List轉(zhuǎn)換成String字符串(或String轉(zhuǎn)換成List)詳解
今天在寫項目的時候遇到一個問題,就是要把得到的一個集合轉(zhuǎn)換成字符串,下面這篇文章主要給大家介紹了關(guān)于Java將集合List轉(zhuǎn)換成String字符串(或String轉(zhuǎn)換成List)的相關(guān)資料,需要的朋友可以參考下2023-06-06你肯定能看懂的Java IO相關(guān)知識總結(jié)
群里有大佬說想讓我寫一篇NIO,一直也沒寫,但是和同事聊天也說對Java的IO不是很清晰,因此今天就寫下Java的io,先打個基礎(chǔ),下次寫NIO,需要的朋友可以參考下2021-05-05解決Swagger2返回map復(fù)雜結(jié)構(gòu)不能解析的問題
這篇文章主要介紹了解決Swagger2返回map復(fù)雜結(jié)構(gòu)不能解析的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot結(jié)合Tess4J實現(xiàn)拍圖識字的示例代碼
圖片中的文字提取已經(jīng)越來越多地應(yīng)用于數(shù)據(jù)輸入和自動化處理過程,本文主要介紹了SpringBoot結(jié)合Tess4J實現(xiàn)拍圖識字的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-06-06