无头浏览器和locust.io

时间:2015-10-01 14:32:30

标签: locust

是否可以将无头浏览器与蝗虫集成?我需要我的负载测试来处理客户端脚本,该脚本会在每次页面加载时触发其他请求。

5 个答案:

答案 0 :(得分:3)

这是一个老问题,但是我现在遇到了,并在“ realbrowserlocusts”(https://github.com/nickboucart/realbrowserlocusts)中找到了一个解决方案-它使用硒添加了“对Locust.io负载测试的Real Browser支持”。

如果您的蝗虫用户类使用其类之一(FirefoxLocust,ChromeLocust,PhantomJSLocust)而不是HttpLocust

class WebsiteUser(HeadlessChromeLocust):

然后在您的TaskSet self.client中成为硒WebDriver的实例


对我来说,一个缺点是Webdriver(与HttpLocust中的内置客户端不同)不了解“主机”,这会强制在TaskSet中使用绝对URL而不是相对URL,并且在使用URL时非常方便使用不同的环境(本地,开发,阶段,产品等)。 但这有一个简单的解决方法:从realbrowserlocusts的蝗虫之一继承并将“ host”传递给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月发布了该解决方案,当时蝗虫的主要版本为0。此后,在2020年5月,他们发布了1.0.0版,其中进行了一些向后不兼容的更改(其中之一-将StopLocust重命名为StopUser) 。 realbrowserlocusts暂时未更新,并且尚未更新,无法与> = 1的蝗虫一起使用。

但是有一种解决方法。。发布locust v1.0.0时,以前的版本以新名称locustio发行,最新版本为0.14.6,因此,如果您安装“ locustio == 0.14.6“(或“ locustio <1”),那么使用realbrowserlocusts的解决方案仍然有效(我刚刚检查了)。 (请参阅https://github.com/nickboucart/realbrowserlocusts/issues/13)。

您必须限制locustio的版本,因为它会在没有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)

答案 1 :(得分:1)

理论上,你可以让无头浏览器成为Locust奴隶/工人。但问题是浏览器在CPU和内存方面要贵得多,这会使其难以扩展。

这就是为什么Locust使用小型greenlets来模拟用户,因为它们构建和运行起来便宜得多。

我建议您分解页面的请求,并将其编码为Locust内部的请求。 Chrome的开发工具中的网络选项卡可能是一个良好的开端。我也听说有人通过代理记录所有请求来捕获这些内容。

答案 2 :(得分:0)

我认为蝗虫不是为了这个目的而设计的,它是为了创建并发用户来发出http请求所以我没有看到任何与locust和浏览器的集成。但是,您可以通过在header中发送额外信息来模拟浏览器,这样客户端脚本也可以工作。

r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0]), 'User-Agent': self.user_agent})

答案 3 :(得分:0)

你可以使用像浏览器这样的东西来处理Chrome的托管(https://browserless.io)。根据您的负载测试的残酷程度,存在不同程度的并发性。完全免责声明:我是无浏览器服务的制造商

答案 4 :(得分:0)

解决此问题的蝗虫方法是向您的测试添加更多请求,以模仿javascript代码的请求。

我构建了我的蝗虫测试来解析应用程序工作流程中早期请求的JSON响应。然后,我随机从该JSON中选择一些有趣的数据,然后发出更多请求,模仿用户点击该数据时在浏览器中会发生什么。