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



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

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

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是否更好,正如我wait_for写的那样,对于obj必须消失而不出现的场景。但是你可能会写一些类似于obj_has_gone_staleobj_has_rendered的东西.它基本上必须尝试访问obj并查看它是否已呈现在页面上并返回 true。然后将函数传递给wait_for

相关内容

  • 没有找到相关文章