是否可以将无头浏览器与蝗虫集成?我需要我的负载测试来处理在每个页面加载时触发额外请求的客户端脚本。
5 回答
这是一个老问题,但我现在遇到了它,并在“realbrowserlocusts”(https://github.com/nickboucart/realbrowserlocusts)中找到了一个解决方案 - 它使用硒添加了“对 Locust.io 负载测试的真正浏览器支持”。
如果您将其类之一(FirefoxLocust、ChromeLocust、PhantomJSLocust)而不是 HttpLocust 用于您的蝗虫用户类
class WebsiteUser(HeadlessChromeLocust):
然后在您的 TaskSet self.client 中成为 selenium WebDriver 的一个实例。
对我来说,一个缺点是 webdriver(与 HttpLocust 中的内置客户端不同)不知道“主机”,这会强制在 TaskSet 中使用绝对 URL 而不是相对 URL,并且在使用不同的 URL 时使用相对 URL 非常方便环境(本地、开发、登台、产品等)。但是有一个简单的解决方法:从 realbrowserlocusts 的蝗虫之一继承并将“主机”传递给 WebDriver 实例:
from locust import TaskSet, task, between
from realbrowserlocusts import HeadlessChromeLocust
class UserBehaviour(TaskSet):
@task(1)
def some_action(self):
# self.client is selenium WebDriver instance
self.client.get(self.client.base_host + "/relative/url")
# and then for inst. using selenium methods:
self.client.find_element_by_name("form-name").send_keys("your text")
# etc.
class ChromeLocustWithHost(HeadlessChromeLocust):
def __init__(self):
super(ChromeLocustWithHost, self).__init__()
self.client.base_host = self.host
class WebsiteUser(ChromeLocustWithHost):
screen_width = 1200
screen_height = 1200
task_set = UserBehaviour
wait_time = between(5, 9)
=============
2020 年 9 月 5 日更新:
我在 2020 年 3 月发布了这个解决方案,当时 locust 的主要版本为 0。从那时起,在 2020 年 5 月,他们发布了 1.0.0 版,其中进行了一些向后不兼容的更改(其中之一 - 将 StopLocust 重命名为 StopUser)。realbrowserlocusts 有一段时间没有更新,也没有更新到 locust >=1。
不过有一个解决方法。当 locust v1.0.0 发布时,以前的版本以新名称发布 - locustio 与最后一个版本 0.14.6,所以如果你安装“locustio==0.14.6”(或“locustio<1”),那么一个解决方案使用 realbrowserlocusts 仍然有效(我刚刚检查过)。(见https://github.com/nickboucart/realbrowserlocusts/issues/13)。
您必须限制 locustio 的版本,因为它拒绝在没有它的情况下安装:
pip install locustio ... ERROR: Command errored out with exit status 1: ... **** Locust package has moved from 'locustio' to 'locust'. Please update your reference (or pin your version to 0.14.6 if you dont want to update to 1.0)
从理论上讲,您可以使无头浏览器成为 Locust 奴隶/工人。但问题是浏览器在 CPU 和内存方面的成本要高得多,这会使其难以扩展。
这就是 Locust 使用小型 greenlets 来模拟用户的原因,因为它们的构建和运行成本要低得多。
我建议您分解页面的请求并将它们编码为 Locust 中的请求。Chrome 开发工具中的网络选项卡可能是一个好的开始。我还听说有人通过记录所有请求的代理来捕获这些请求。
您可以使用无浏览器之类的东西来托管 Chrome ( https://browserless.io )。根据您对负载测试的残酷程度,存在不同程度的并发。完全免责声明:我是无浏览器服务的制造商
我认为 locust 不是为此目的而设计的,它是为了创建并发用户来发出 http 请求,所以我没有看到与 locust 和浏览器的任何集成。但是,您可以通过发送额外信息来模拟浏览器header
,这样客户端脚本也可以工作。
r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0]), 'User-Agent': self.user_agent})
解决此问题的蝗虫方法是向您的测试添加更多请求,以模仿 javascript 代码将发出的请求。
我构建我的 locust 测试来解析来自应用程序工作流程中早期请求的 JSON 响应。然后,我从该 JSON 中随机挑选一些有趣的数据,然后发出更多请求,模拟用户单击该数据时浏览器中会发生的情况。