selenium學習筆記11——driver.get(url) 頁面加載時間太長


在執行自動化測試用例過程中,發現因為網絡慢或其他原因導致driver.get(url) 時,頁面一直在加載,頁面沒有加載完成就不會去繼續執行下面的動作,但是實際上需要操作的元素已經加載出來了。

解決方法

第一步:使用 set_script_timeout() 設置等待最大時間。

第二步:到了最大等待時間后頁面如果仍然沒有加載完成,執行js代碼, driver.execute_script("window.stop()") 停止頁面加載,執行下面的自動化測試步驟。
代碼如下:

driver = self.driver
  1. 設置了最大等待時間為10秒。
  2. 如果10秒沒有加載完成,打印“time out after 10 seconds when loading page!”,然后停止加載,直接執行下面的測試步驟。
# 設置頁面最大加載時間
        driver.set_page_load_timeout(10)
        try:
            driver.get(self.base_url)
        except TimeoutException:
            print '!!!!!!time out after 10 seconds when loading page!!!!!!'
            # 當頁面加載時間超過設定時間,通過js來stop,即可執行后續動作
            driver.execute_script("window.stop()")
  1. 設置了最大等待時間為10秒。
  2. 如果10秒沒有加載完成,打印“time out after 10 seconds when loading page!”,然后停止加載,直接執行下面的測試步驟。
    def page_loading_timeout(driver, url, time):
        '''
        :param driver: 參數1,傳入瀏覽器對象
        :param url: 參數2,傳入url
        :param time: 參數3,設置超時時間,單位是秒
        :return:
        '''
        driver.set_page_load_timeout(time)
        try:
            driver.get(url)
        except:
            print "!!!!!!time out after %s seconds when loading page!!!!!!" % time
            # 當頁面加載時間超過設定時間,通過js來stop,即可執行后續動作
            driver.execute_script("window.stop()")

     

解決了。 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities desired_capabilities = DesiredCapabilities.CHROME # 修改頁面加載策略 # none表示將br.get方法改為非阻塞模式,在頁面加載過程中也可以給br發送指令,如獲取url,pagesource等資源。

desired_capabilities["pageLoadStrategy"] = "none"

driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=chrome_driver_path, desired_capabilities=desired_capabilities)

首先需要區分兩種超時情況,一種是頁面加載出現的超時,一種是獲取頁面元素的超時。

對於頁面加載出現的超時,Selenium提供了兩個設置:

driver.set_page_load_timeout()  # 設置頁面加載超時
driver.set_script_timeout()  # 設置頁面異步js執行超時

set_page_load_timeout是用於設置頁面加載超時,如下圖在指定時間內未加載出頁面則會報錯。

image

set_script_timeout,用於execute_async_script()執行的異步js超時報錯。

注意:使用set_page_load_timeout時候,當頁面未加載出任何東西的時候(往往是html源碼未加載),因為超時而停止,會導致driver失效,后面的driver都不能操作,所以超時設置應該至少保證頁面內容加載出來一部分,設置超時不宜過短,如下圖在頁面此種狀態下停止加載后driver失效。

image

頁面加載超時在打開新頁面、頁面刷新、跳轉等方法執行中會起作用,對於頁面異步加載超時問題可以配合使用js停止,該js語法如下:

window.stop()

顯示等待(explicit)

顯式等待是使用頻率最高的獲取頁面元素超時設置,其原理是通過設置一個最大時間和一個周期時間,按照周期時間來檢測是否出現等待元素,直到達到了最大等待時間。

顯示等待的基本語法如下:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
 
driver = webdriver.Chrome()
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, 'wrapper')))
WebDriverWait(driver, 3).until_not(EC.presence_of_element_located((By.ID, 'wrapper1')))

其中WebDriverWait用來給指定driver設置超時時間,until、until_not有兩個參數method、message,method是EC即expected_conditions類提供的預先判斷條件,message是在超時發生時候的提示信息。

until用來檢測指定元素是否出現,如果在超時時間內出現則返回選擇器信息,否則報出TimeoutException異常。

until_not用於檢測指定元素是否消失,如果在超時時間內消失則返回True,否則會報出TimeoutException異常。

method是EC即expected_conditions類提供的預先判斷條件如下:

WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))
# 判斷title,返回布爾值
 
WebDriverWait(driver,10).until(EC.title_contains(u"百度一下"))
# 判斷title,返回布爾值
 
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
# 判斷某個元素是否被加到了dom樹里,並不代表該元素一定可見,如果定位到就返回WebElement
 
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))
# 判斷某個元素是否被添加到了dom里並且可見,可見代表元素可顯示且寬和高都大於0
 
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))
# 判斷元素是否可見,如果可見就返回這個元素
 
WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.mnav')))
# 判斷是否至少有1個元素存在於dom樹中,如果定位到就返回列表
 
WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))
# 判斷是否至少有一個元素在頁面中可見,如果定位到就返回列表
 
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'設置'))
# 判斷指定的元素中是否包含了預期的字符串,返回布爾值
 
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#su'),u'百度一下'))
# 判斷指定元素的屬性值中是否包含了預期的字符串,返回布爾值
 
#WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it(locator))
#  判斷該frame是否可以switch進去,如果可以的話,返回True並且switch進去,否則返回False注意這里並沒有一個frame可以切換進去
 
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#swfEveryCookieWrap')))
# 判斷某個元素在是否存在於dom或不可見,如果可見返回False,不可見返回這個元素注意#swfEveryCookieWrap在此頁面中是一個隱藏的元素
 
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()
# 判斷某個元素中是否可見並且是enable的,代表可點擊
driver.find_element_by_xpath("//*[@id='wrapper']/div[6]/a[1]").click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='wrapper']/div[6]/a[1]"))).click()
 
WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'su')))
# 等待某個元素從dom樹中移除
 
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]")))
# 判斷某個元素是否被選中了,一般用在下拉列表
 
WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='nr']/option[1]"),True))
# 判斷某個元素的選中狀態是否符合預期
 
WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='nr']/option[1]"),True))
# 判斷某個元素的選中狀態是否符合預期
driver.find_element_by_xpath(".//*[@id='gxszButton']/a[1]").click()
 
instance = WebDriverWait(driver,10).until(EC.alert_is_present())
# 判斷頁面上是否存在alert,如果有就切換到alert並返回alert的內容
instance.accept()
# 關閉彈窗

部分配置來源參考:https://www.cnblogs.com/wxcx/p/8948280.html

注意:顯示等待和隱式等待都存在的,按照其中超時時間設置最大的方式來執行。

http://npm.taobao.org/mirrors/chromedriver/     Chromedriver下載地址

System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM