2017-07-06 25 views
1

我在嘗試在我正在處理的公司網站上準確檢測頁面加載時間。我決定嘗試使用python和selenium來做到這一點,這樣我就可以實現自動化。不過,由於我無法獲得可靠的網頁加載時間,因此我似乎遇到了困難。罪魁禍首似乎是這樣的事實,我們不認爲頁面「加載」,直到約3秒ajax呼叫結束。然而,Selenium認爲在DOM完全加載之前加載頁面,這不是我們正在尋找的加載時間。我在線閱讀過,我可以使用WebDriverWait函數輪詢ajax執行後出現的元素。我應該能夠做到這一點,因爲在ajax調用之後創建了新的元素,但是,我在網上注意到它的輪詢頻率爲500ms,這對我來說太大了。我試圖非常準確地確定頁面加載時間,500毫秒是一個很大的誤差。我找不到任何關於如何更改python中的默認輪詢頻率的任何內容,只是Java中類似的東西,我不能解密。如果您知道如何大幅降低輪詢頻率,或者更好地瞭解如何使用Ajax獲得準確的頁面加載時間,誤差範圍約爲50ms,請讓我知道。謝謝。在Python中使用Selenium精確檢測帶有AJAX加載時間的頁面

回答

0

在我的項目之一,我寫了這樣的功能:

def wait_for(condition_function, *args): 
    start_time = time.time() 
    while time.time() < start_time + 10: 
     if condition_function(*args): 
      return True 
     else: 
      time.sleep(0.1) 
    raise TimeoutException(
     'Timeout waiting for {}'.format(condition_function.__name__) 
    ) 

以後使用它像這樣:

wait_for(obj_has_gone_stale, login_btn) 

其中login_btn是硒對象,obj_has_gone_stale是試圖給一個函數找到對象並捕獲一個StaleElementReferenceException。它看起來像這樣:

def obj_has_gone_stale(obj): 
    try: 
     # poll the link with an arbitrary call 
     obj.find_elements_by_id('doesnt-matter') 
     return False 
    except StaleElementReferenceException: 
     return True 

用這種方法你可以設置time.sleep()wait_for你想要的任何時間。但不要忘記,obj.find_elements_by_id('doesnt-matter')也可能需要一些時間來執行。不知道是否Selenium內置wait for presence好多了,因爲我寫了wait_for,因爲obj必須消失而不會出現。但是你可以寫一些類似於obj_has_gone_stale但是obj_has_rendered的東西。它基本上必須嘗試訪問obj並查看它是否已在頁面上呈現並返回true。然後將該功能傳遞給wait_for

相關問題