【问题标题】:Accurately detect page with AJAX load time in Python using Selenium使用 Selenium 在 Python 中准确检测具有 AJAX 加载时间的页面
【发布时间】:2017-07-06 20:06:02
【问题描述】:

我正在尝试准确检测我正在处理的公司网站上的页面加载时间。我决定尝试使用 python 和 selenium 来执行此操作,以便将其自动化。但是,由于无法获得可靠的页面加载时间,我似乎遇到了困难。罪魁祸首似乎是我们直到大约 3 秒的 ajax 调用完成才认为页面“已加载”。然而,Selenium 会考虑在 DOM 完全加载之前加载的页面,这不是我们正在寻找的加载时间。我已经在线阅读了我可以使用 WebDriverWait 函数来轮询在 ajax 执行后出现的元素。我应该能够做到这一点,因为在 ajax 调用之后创建了新元素,但是,我在网上注意到它的轮询频率为 500 毫秒,这对我来说太大了。我正在尝试非常准确地确定页面加载时间,而 500 毫秒是一个很大的误差范围。我在网上找不到任何关于如何更改 python 中的默认轮询频率的信息,只是 Java 中我无法破译的类似内容。如果您知道如何大幅降低轮询频率,或者更好地了解如何使用 Ajax 获得准确的页面加载时间,误差范围约为 50 毫秒,请告诉我。谢谢。

【问题讨论】:

    标签: python performance selenium selenium-chromedriver


    【解决方案1】:

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

    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') 也可能需要一些时间来执行。不确定Selenium 内置wait for presence 是否更好,因为我写了wait_for,用于obj 必须消失而不出现的情况。但是你可以写一些类似于obj_has_gone_staleobj_has_rendered 的东西。它基本上必须尝试访问obj 并查看它是否已在页面上呈现并返回true。然后将函数传递给wait_for

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2020-04-13
    • 2013-09-14
    相关资源
    最近更新 更多