2017-07-06 113 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

相关问题