使用Selenium在Python中使用AJAX加载时间准确检测页面

时间:2017-07-06 20:06:03

标签: python performance selenium selenium-chromedriver

我试图在我正在处理的公司网站上准确检测页面加载时间。我已经决定尝试使用python和selenium这样做,所以我可以自动化它。但是,由于我无法获得可靠的页面加载时间,因此我似乎遇到了障碍。罪魁祸首似乎是我们不考虑页面" loading"直到约3秒的ajax呼叫结束。然而,Selenium认为在此之前DOM完全加载时加载页面,这不是我们正在寻找的加载时间。我在线阅读我可以使用WebDriverWait函数来查询ajax执行后出现的元素。我应该能够在ajax调用之后创建新元素,但是,我在网上注意到它的轮询频率为500毫秒,这对我来说太大了。我试图非常准确地确定页面加载时间,500毫秒是一个很大的误差范围。我无法在网上找到任何关于如何更改python默认轮询频率的内容,就像Java中我无法解读的类似内容。如果您知道如何减少轮询频率或更好地了解如何使用Ajax获得准确的页面加载时间,误差大约为50ms,请告诉我。谢谢。

1 个答案:

答案 0 :(得分: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是Selenium对象,而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_staleobj_has_rendered的东西。它基本上必须尝试访问obj并查看它是否已在页面上呈现并返回true。然后将函数传递给wait_for