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

2024-04-23 23:03:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力准确地检测我正在工作的公司网站上的页面加载时间。我决定尝试使用python和selenium来实现这一点,这样我就可以实现自动化。然而,由于无法获得可靠的页面加载时间,我似乎遇到了麻烦。罪魁祸首似乎是这样一个事实:在3秒ajax调用完成之前,我们不认为页面“已加载”。然而,Selenium会考虑在DOM完全加载之前加载的页面,这不是我们要寻找的加载时间。我在网上读到,我可以使用WebDriverWait函数轮询ajax执行后出现的元素。我应该可以这样做,因为在ajax调用之后创建了新元素,但是,我在网上注意到它的轮询频率是500毫秒,这对我来说太大了。我试图非常准确地确定页面加载时间,500毫秒是一个很大的误差范围。我在网上找不到任何关于如何在python中更改默认轮询频率的信息,只是Java中类似的东西我无法解读。如果你知道如何减少轮询频率很多,或有一个更好的想法,如何获得准确的页面加载时间与Ajax的误差幅度约50毫秒,请让我知道。非常感谢。你知道吗


Tags: 函数元素网站selenium时间公司ajax页面
1条回答
网友
1楼 · 发布于 2024-04-23 23:03:58

在我的一个项目中,我写了这样一个函数:

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

使用这种方法,您可以随时在wait_for内设置time.sleep()。但别忘了考虑obj.find_elements_by_id('doesnt-matter')也可能需要一些时间来执行。我写的硒内置的wait for presence对于obj必须消失而不出现的场景是否更好,这一点不确定。但是你可以写一些类似于obj_has_gone_stale但是obj_has_rendered的东西。它基本上必须尝试访问obj,并查看它是否已在页面上呈现并返回true。然后将函数传递给wait_for。你知道吗

相关问题 更多 >